如何在PreferenceActivity中添加工具栏

5

我已经使用Preferences创建了一个应用设置。但是我发现,在我的PreferenceActivity中没有工具栏。

我该如何为我的PreferenceActivity添加工具栏?

我的代码:

我的pref_xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
    android:key="select_class"
    android:title="@string/select_class"
    android:defaultValue="0"
    android:entries="@array/classy"
    android:entryValues="@array/classy"
    android:dialogTitle="@string/select_class" />
</PreferenceScreen>

我的PrefActivity.java文件:

package ***.***.***;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;

public class PrefActivity extends PreferenceActivity {
@Override
protected void onCreate(final Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefFragment()).commit();
}

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

PS Gautam,在您的.java代码中,第一行存在错误:

setSupportActionBar(toolbar); :

     java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx/xxx.PrefActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
                                                                             at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                             at android.os.Looper.loop(Looper.java:135)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5349)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at java.lang.reflect.Method.invoke(Method.java:372)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
                                                                          Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
                                                                             at android.support.v7.app.AppCompatDelegateImplV7.setSupportActionBar(AppCompatDelegateImplV7.java:198)
                                                                             at android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:130)
                                                                             at com.smartfon_apps.timetable_sch32.PrefActivity.onCreate(PrefActivity.java:21)
                                                                             at android.app.Activity.performCreate(Activity.java:6020)
                                                                             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
                                                                             at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 
                                                                             at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                             at android.os.Looper.loop(Looper.java:135) 
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5349) 
                                                                             at java.lang.reflect.Method.invoke(Native Method) 
                                                                             at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703

在你的活动布局中使用Toolbar,结合AppCompatActivity,使用PreferenceFragment。 - JAAD
你无法在活动布局中设置工具栏?怎么办? - JAAD
1个回答

16
使用扩展了AppCompatActivity的活动,其中包含从布局文件引用的工具栏,如下所示:
public class UserSettingPreference extends AppCompatActivity {

Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.toolbar);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle("Settings");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                onBackPressed();

        }
    });
    getFragmentManager().beginTransaction().replace(R.id.fragment_container,
            new UserPreferenceFragment()).commit();
}

}

定义一个布局,其中包含一个工具栏和一个帧布局来容纳碎片

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

<Toolbar 
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#80000000"
    android:minHeight="?android:attr/actionBarSize"
    app:contentInsetEnd="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetStart="0dp"/>


<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  />
</LinearLayout>

然后像下面这样定义你的片段扩展偏好片段 -

public class UserPreferenceFragment extends PreferenceFragment

要引用您的preference.xml覆盖onCreate片段,请按以下方式操作 -
 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.fragment_preference);
}

要在您的preference.xml中引用特定元素,请使用getPreferenceScreen方法。
switchPreference = (SwitchPreference) getPreferenceScreen().findPreference("floating_widget");

在线性布局中,不需要使用“layout_below”。 - Vivek Mishra
我的pref.xml在哪里? - Олег Медведев
请查看我的更新答案。如果对您有效,请接受答案 :) - Gautam
@Gautam switchPreference = (SwitchPreference) getPreferenceScreen().findPreference("floating_widget"); @高塔姆 switchPreference =(SwitchPreference)getPreferenceScreen()。findPreference(“floating_widget”); - Олег Медведев
既然您正在使用ListPreference,那么请相应地进行更改。我只是提供参考。您可以在onCreate中像这样使用它:ListPreference listPreference = (ListPreference) getPreferenceScreen().findPreference("select_class"); 它的行为类似于findViewById方法。 - Gautam
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接