25

我在我的应用程序中添加了首选项标题,以便首选项屏幕在 Honeycomb 和平板电脑大小的 ICS 上看起来不会损坏。但是,我目前只有一个标题,因此您必须单击标题屏幕,在手机大小的设备上只有一个条目。当只有一个标题时,是否有一种简单的方法可以告诉 android 跳过标题屏幕,但仍然在大屏幕上显示它?

股票联系人应用程序似乎成功地做到了这一点,但我浏览了它的源代码并且无法弄清楚它是如何做到的。

4

4 回答 4

61

您可以通过将您的 PreferenceFragments 之一设置为默认值来跳过标题。

当您查看PreferenceActivity.java源代码时,您会发现以下两个额外内容:

/**
 * 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";

现在只需将这两个附加内容添加到调用您的 PrefenceActivity 的意图中,并指定默认情况下应显示的 PreferenceFragment 如下:

Intent intent = new Intent( this, Preferences.class );
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName() );
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
于 2012-06-09T11:45:12.327 回答
4

利用EXTRA_SHOW_FRAGMENTjenzz 提到的,您可以操纵 Activity 的 Intent,如下所示:

@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);
}
于 2014-02-12T04:55:35.223 回答
3

您可以在活动中删除此代码。

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

并替换您的片段:

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);

        }

    }

}
于 2017-02-07T16:27:20.523 回答
1

我不知道您是否可以专门跳过标题,但这就是我所做的。

我创建了 2 个类,一个用于超大屏幕尺寸,一个用于其余的。EditPreferences.class 加载我正常的preferences.xml,EditPreferencesXLarge.class 加载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));
}
于 2012-06-07T14:51:51.843 回答