Skip the headers in PreferenceActivity when there's only one header

前端 未结 4 1753
无人共我
无人共我 2020-12-24 07:48

I added preference-headers to my app so that the preference screen would not look broken on Honeycomb and tablet sized ICS. However, I only have one header at the moment so

相关标签:
4条回答
  • 2020-12-24 08:28

    You can skip the headers by setting one of your PreferenceFragments as default.

    When you take a look at the PreferenceActivity.java source, you will find these two extras:

    /**
     * When starting this activity, the invoking Intent can contain this extra
     * string to specify which fragment should be initially displayed.
     */
    public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";
    
    /**
     * When starting this activity, the invoking Intent can contain this extra
     * boolean that the header list should not be displayed.  This is most often
     * used in conjunction with {@link #EXTRA_SHOW_FRAGMENT} to launch
     * the activity to display a specific fragment that the user has navigated
     * to.
     */
    public static final String EXTRA_NO_HEADERS = ":android:no_headers";
    

    Now simply add these two extras to the intent which is invoking your PrefenceActivity and specify the PreferenceFragment which should be shown by default as follows:

    Intent intent = new Intent( this, Preferences.class );
    intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName() );
    intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
    
    0 讨论(0)
  • 2020-12-24 08:34

    I don't know if you can specifically skip the header, but this is what I did.

    I created 2 classes, one for Extra Large screen sizes, and one for the rest. EditPreferences.class loads my normal preferences.xml, and the EditPreferencesXLarge.class loads the preference-headers xml.

    public boolean onOptionsItemSelected(MenuItem item) {
        final int SCREENLAYOUT_SIZE_XLARGE = 4;
        final int HONEYCOMB = 11;
        int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
    
        switch(item.getItemId())
        {
            case R.id.item_prefs:
                if (Build.VERSION.SDK_INT < HONEYCOMB) {
                    startActivity(new Intent(this, EditPreferences.class));
                }
                else if (screenSize < SCREENLAYOUT_SIZE_XLARGE) {
                    startActivity(new Intent(this, EditPreferences.class));
                }
                else {
                    startActivity(new Intent(this, EditPreferencesXLarge.class));
                }
    
                return true;
        }
    
        return (super.onOptionsItemSelected(item));
    }
    
    0 讨论(0)
  • 2020-12-24 08:40

    You can remove this code in your activity.

         public void onBuildHeaders(List<Header> target) {
            loadHeadersFromResource(R.xml.pref_general, target);
        }
    

    And replace your fragment :

    public class SettingsActivity extends AppCompatPreferenceActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
               getFragmentManager().beginTransaction().replace(android.R.id.content,
                    new GeneralPreferenceFragment()).commit();
    
        }
    
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public static class GeneralPreferenceFragment extends PreferenceFragment {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.pref_general);
    
            }
    
        }
    
    }
    
    0 讨论(0)
  • 2020-12-24 08:47

    Utilizing the EXTRA_SHOW_FRAGMENT mentioned by jenzz, you can manipulate the Activity's Intent, like so:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      // By default, show MainPreferences
      Intent intent = getIntent();
      if (intent.getStringArrayExtra(EXTRA_SHOW_FRAGMENT) == null) {
        getIntent().putExtra(EXTRA_SHOW_FRAGMENT, MainPreferences.class.getName());
      }
    
      super.onCreate(savedInstanceState);
    }
    
    0 讨论(0)
提交回复
热议问题