17

私はsupport-v7ライブラリから使用PreferenceFragmentしています。 私が持っている活動で。ネストされた を開くまで、すべてがうまくいきます。 開いた画面では が非表示になっています。ActionBarActivity
ToolbarPreferenceScreen
Toolbar

多分誰かがこの問題の回避策を知っていますか?

設定xmlファイル:

<?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory android:title="Main category" >

        <EditTextPreference
            android:defaultValue="defaultValue"
            android:key="key_global_setting"
            android:title="Global title" />        

    </PreferenceCategory>

    <PreferenceCategory android:title="Nested screens" >        

        <PreferenceScreen
            android:persistent="false"
            android:title="@string/settings_facility_title" >

        <CheckBoxPreference
            android:defaultValue="false"
            android:key="nested_screen_1_1"
            android:title="Nested screen 1.1 check box" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="nested_screen_1_2"
            android:title="Nested screen 1.2 check box" />
        </PreferenceScreen>

        <PreferenceScreen
            android:persistent="false"
            android:title="@string/settings_menu_screen_title" >

         <CheckBoxPreference
            android:defaultValue="true"
            android:key="nested_screen2"
            android:title="Nested screen 2 check box" />
        </PreferenceScreen>        

    </PreferenceCategory>    

</PreferenceScreen> 

アクティビティのレイアウト:

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

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        style="@style/Toolbar" />

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

</LinearLayout>
4

4 に答える 4

0

私のソリューションでは、必要なのは 1 つと 1 つだけですAppCompatActivityPreferenceFragement、複数の XML ファイルがあり、それぞれに 1 つのレベルしかありませんPreferenceScreens

XML ファイル一覧

  • トップレベルの PreferenceScreen
  • 第 2 レベルの PreferenceScreen 0
  • 第 2 レベルの PreferenceScreen 1
  • 第 2 レベルの PreferenceScreen 2
  • ...

このコードは 1 つのサブレベル用です (簡単にするため、およびアイデアを得るために)、任意のサブレベルを持つように簡単に拡張できますPreferenceScreens

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment
{
    private int xmlId;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        xmlId = R.xml.preferences;
        addPreferencesFromResource(xmlId);
    }

    public void changePrefScreen(int xmlId, int titleId)
    {
        this.xmlId = xmlId;
        ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(getActivity().getResources().getString(titleId));
        getPreferenceScreen().removeAll();
        addPreferencesFromResource(xmlId);
    }

    // will be called by SettingsActivity (Host Activity)
    public void onUpButton()
    {
        if(xmlId == R.xml.preferences) // in top-level
        {
            // Switch to MainActivity
            Intent intent = new Intent(getActivity(), MainActivity.class);
            startActivity(intent);
        }
        else // in sub-level
        {
            changePrefScreen(R.xml.preferences, R.string.settings);
        }
    }

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
    {
        String key = preference.getKey();

        //
        // Top level PreferenceScreen
        //
        if(key.equals("top_key_0"))
        {
            changePrefScreen(R.xml.download_preference_screen, R.string.download_database); // descend into second level
        }

        // ...

        //
        // Second level PreferenceScreens
        //
        if (key.equals("second_level_key_0"))
        {
           // do something...
        }

        // ...
     }

設定Activity.java

public class SettingsActivity extends AppCompatActivity
{
    SettingsFragment settingsFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        settingsFragment = new SettingsFragment();

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, settingsFragment)
                .commit();
    }

    //
    // Handle what happens on up button
    //
    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        switch (item.getItemId()) 
        {
            case android.R.id.home:
                settingsFragment.onUpButton();
                return true;
        }
        return true;
    }

    // ...
}

技術的には、 が利用可能なすべての Android バージョンで動作するはずPreferenceFragmentです。

于 2016-09-05T11:39:28.757 に答える