我正在尝试在我的首选项屏幕中显示一个操作栏。为此,我在SettingActivity中添加了以下代码
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); }
发布于 2015-04-12 05:40:48
我终于找到了一种方法来做到这一点。它有点丑陋,但它是有效的。
首先,我向preferences.xml文件中的每个PreferenceScreen定义添加了相同的意图(确保更新额外参数的值)
<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中添加了一个意图过滤器
<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中添加了一些代码来处理此问题
@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类中添加了以下代码
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);
}
}
发布于 2016-03-21 00:39:32
也有同样的问题。嵌套的PreferenceScreen
%s没有ActionBar。单步执行代码后,它似乎是由AppCompatActivity
和PreferenceScreen
之间的冲突引起的。
一方面,AppCompatActivity
提供了自己的操作栏,因此需要一个从Theme.AppCompat
下来的主题,它指定了某个地方的windowNoTitle = true
(不能精确地定位在哪里)。另一方面-- PreferenceScreen
使用带有活动主题(而不是子主题,例如dialogTheme
)的platform Dialog
。可能是个窃听器。
如果你不关心Theme.AppCompat
,这里有一个适用于21+接口的简单解决方法:
对于AndroidManifest.xml
中的此活动,
android.preference.PreferenceActivity
作为activityandroid:theme="@style/PreferenceTheme"
的主题你得到的更像是一个标准的窗口标题,而不是一个完整的ActionBar。我还没有想出如何添加一个工作的后退按钮,等等。
如果您想保持与AppCompatActivity
和相关主题的兼容性,则需要在activity窗口中请求FEATURE_NO_TITLE
。否则,您最终将在顶级PreferenceScreen
中得到两个操作栏(顶部的内置工具条和底部的支持工具条)。
发布于 2016-05-29 22:43:12
遗憾的是,谷歌直到现在还没有解决这个问题,实际上有一个更简单的解决方案:
在v21/ public class SettingsActivity extends Activity { ...
在您的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>
如果您想为旧设备提供材料设计支持,则<activity android:name=".SettingsActivity" android:label="@string/title_activity_settingsactivity" android:theme="@style/CustomThemeSettings" > </activity>
您可以将SettingsActivity放在v21+文件夹中,并为具有父AppCompat的旧设备创建其他SettingsActivity。
https://stackoverflow.com/questions/29357292
复制相似问题