【问题标题】:No actionBar with app-compat-v21 library in preferenceactivity?在preferenceactivity 中没有带有app-compat-v21 库的actionBar?
【发布时间】:2014-12-12 21:03:54
【问题描述】:

我在使用 ActionBar 和 app-compat-v21 时遇到问题。
除了PreferenceActivity,ActionBar 随处可见
我尝试遵循建议并使用 Fragments 完成:

public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
 }
}

public class PrefsActivity extends PreferenceActivity {
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getFragmentManager().beginTransaction()
            .replace(android.R.id.content, new PrefsFragment()).commit();
 }
}

但是,没有 ActionBar。
顺便说一句,在Styles.xml 中设置为<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

怎么了?

【问题讨论】:

  • 哦,真的吗? look at the picture
  • PreferenceActivity 已弃用,取而代之的是 PreferenceFragment。因此,您的设置屏幕应该是由 AppCompat 库中的 ActionBarActivity 托管的 PreferenceFragment

标签: android android-actionbar android-appcompat material-design


【解决方案1】:

要使用新的 appcompat v21,您必须:

  • 扩展AppCompatActivity
  • 使用继承自 Theme.AppCompat 的主题。(例如 Light 或 NoActionBar)

PreferenceActivity 不扩展AppCompatActivity

这就是你的代码中没有操作栏的原因。

作为解决方案,您可以按照自己的方式创建 PreferenceFragment 并在标准 AppCompatActivity使用它

2015 年 12 月 6 日更新

使用新的 22.1+ appcompat,您还可以使用 AppCompatDelegate 将 AppCompat 的支持扩展到任何 Activity。

您可以查看AppCompatPreferenceActivity 的官方链接,您可以在其中找到该技术的示例。

【讨论】:

  • 所以,我只需要自己扩展ActionBarActivity,让它看起来像PreferenceActivity,对吧?
  • 你能给我一个例子吗?找不到合适的
  • 即使您扩展 ActionBarActivity,Preference 也没有 ActionBar。您必须使用toolbar
  • @donniezazen 这取决于你的风格。当然你可以使用工具栏。
  • 这对我有用。谢谢你:)
【解决方案2】:

与应用兼容,需要在布局中定义工具栏。您可以使用工具栏为 Settings Activity 创建布局,然后添加首选项片段。

例如:

activity_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <fragment
        android:id="@+id/settings_fragment"
        android:name="com.bla.bla.MyPreferenceFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar" />

</RelativeLayout>

设置活动:

public class SettingsActivity extends ActionBarActivity{
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        Toolbar actionbar = (Toolbar) findViewById(R.id.toolbar);
        actionbar.setTitle("Settings");
        actionbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SettingsActivity.this.finish();
            }
        });
    }

我的偏好片段:

public static class MyPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);;
    }
}

编辑:更新了使用 ActionBarActivity 而不是弃用的 PreferenceActivity 的答案

【讨论】:

  • XML 中的“片段”部分是干什么用的?我在哪里可以描述设置(例如在preferences.xml 中)?
  • 嗨。我已经用 PreferenceFragment 的示例更新了我的答案,您可以在其中从 xml 文件加载所有首选项。 xml 中的片段部分是直接将片段加载到布局中,而无需从代码中调用片段管理器事务(您也可以将框架布局用作片段容器)。
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多