首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改PreferenceScreen时保持操作栏在中显示

更改PreferenceScreen时保持操作栏在中显示
EN

Stack Overflow用户
提问于 2015-03-31 06:13:26
回答 8查看 8.3K关注 0票数 18

我正在尝试在我的首选项屏幕中显示一个操作栏。为此,我在SettingActivity中添加了以下代码

代码语言:javascript
复制
public class PreferencesActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preferences_activity);
        getFragmentManager().beginTransaction()
                .replace(R.id.container, new PreferencesFragment()).commit();

            getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

然后用PreferencesFragment编写我的其余代码。这很好用,但只要我按下PreferenceScreen首选项,操作栏就会隐藏起来。如果我返回到首选项主屏幕,我可以再次看到它。你知道如何保持操作栏的显示(并使用PreferenceScreen标签进行更新)吗?

编辑:查看PreferenceScreen代码,当单击PreferenceScreen时,看起来就像是打开了一个全屏对话框。因为我的首选项有一个标题,所以对话框也应该显示一个标题...但它不是

// Set the title bar if title is available, else no title bar final CharSequence title = getTitle(); Dialog dialog = mDialog = new Dialog(context, context.getThemeResId()); if (TextUtils.isEmpty(title)) { dialog.getWindow().requestFeature(Window.FEATURE\_NO\_TITLE); } else { dialog.setTitle(title); }

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-04-12 05:40:48

我终于找到了一种方法来做到这一点。它有点丑陋,但它是有效的。

首先,我向preferences.xml文件中的每个PreferenceScreen定义添加了相同的意图(确保更新额外参数的值)

代码语言:javascript
复制
        <PreferenceScreen
            android:key="pref1"
            android:summary="Summary1"
            android:title="Title1" >
            <intent
                android:action="android.intent.action.VIEW"
                android:targetPackage="my.package"
                android:targetClass="my.package.activity.PreferencesActivity" >
                <extra android:name="page" android:value="pref1" />
            </intent>
...

</PreferenceScreen>

顺便说一句,my.package.activity.PreferencesActivity是我当前的首选活动

然后我在Manifest中添加了一个意图过滤器

代码语言:javascript
复制
        <activity
            android:name=".activity.PreferencesActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/settings" >
            <intent-filter android:label="Pref" >
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.PREFERENCE" />
            </intent-filter>
  </activity>

我在PreferenceActivity中添加了一些代码来处理此问题

代码语言:javascript
复制
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preferences_activity);

        this.fragment = new PreferencesFragment();
        this.fragment.setActivityIntent(getIntent());
        getFragmentManager().beginTransaction()
                .replace(R.id.container, this.fragment).commit();
    }

最后,我在PreferencesFragment类中添加了以下代码

代码语言:javascript
复制
    public void setActivityIntent(final Intent activityIntent) {
 if (activityIntent != null) {
                        if (Intent.ACTION_VIEW.equals(activityIntent.getAction())) {

                        if (intent.getExtras() != null) {
                            final String page = intent.getExtras().getString("page");
                            if (!TextUtils.isEmpty(page)) {
                                openPreferenceScreen(page);
                            }
                        }
                    }
    }

private void openPreferenceScreen(final String screenName) {
    final Preference pref = findPreference(screenName);
    if (pref instanceof PreferenceScreen) {
        final PreferenceScreen preferenceScreen = (PreferenceScreen) pref;
        ((PreferencesActivity) getActivity()).setTitle(preferenceScreen.getTitle());
        setPreferenceScreen((PreferenceScreen) pref);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2016-03-21 00:39:32

也有同样的问题。嵌套的PreferenceScreen%s没有ActionBar。单步执行代码后,它似乎是由AppCompatActivityPreferenceScreen之间的冲突引起的。

一方面,AppCompatActivity提供了自己的操作栏,因此需要一个从Theme.AppCompat下来的主题,它指定了某个地方的windowNoTitle = true (不能精确地定位在哪里)。另一方面-- PreferenceScreen使用带有活动主题(而不是子主题,例如dialogTheme)的platform Dialog。可能是个窃听器。

如果你不关心Theme.AppCompat,这里有一个适用于21+接口的简单解决方法:

对于AndroidManifest.xml中的此活动,

  • 使用android.preference.PreferenceActivity作为activity
  • create的基类该activity:
  • specify android:theme="@style/PreferenceTheme"的主题

你得到的更像是一个标准的窗口标题,而不是一个完整的ActionBar。我还没有想出如何添加一个工作的后退按钮,等等。

如果您想保持与AppCompatActivity和相关主题的兼容性,则需要在activity窗口中请求FEATURE_NO_TITLE。否则,您最终将在顶级PreferenceScreen中得到两个操作栏(顶部的内置工具条和底部的支持工具条)。

票数 6
EN

Stack Overflow用户

发布于 2016-05-29 22:43:12

遗憾的是,谷歌直到现在还没有解决这个问题,实际上有一个更简单的解决方案:

  1. 将您的SettingsActivity类设置为仅扩展"Activity“。

在v21/ public class SettingsActivity extends Activity { ...

  • Create文件夹中为SettingsActivty设置一个新主题,并将父主题设置为“Theme.Material*”。

在您的Manifest.xml文件中<style name="CustomThemeSettings" parent="android:Theme.Material"> <item name="android:colorPrimary">@color/...</item> <item name="android:colorPrimaryDark">@color/...</item> <item name="android:colorAccent">@color/...</item> </style>

  • Set您的新主题:

如果您想为旧设备提供材料设计支持,则<activity android:name=".SettingsActivity" android:label="@string/title_activity_settingsactivity" android:theme="@style/CustomThemeSettings" > </activity>

  • It仅适用于:)

  • (Optional)

您可以将SettingsActivity放在v21+文件夹中,并为具有父AppCompat的旧设备创建其他SettingsActivity。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29357292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档