7

この方法で XML ファイルからヘッダーを追加する PreferenceFragment と PreferenceActivity があります。

PreferenceActivity

@Override
public void onBuildHeaders(List<Header> target) {  
    if(DEBUG) Log.i("PreferenceActivity", "onBuildHeaders() -> LogicAnalizerPrefs");
    if(android.os.Build.VERSION.SDK_INT >= 12) {
        loadHeadersFromResource(R.xml.preference_header_logicanalizer, target);
    }
}

プリファレンスフラグメント:

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

        if(DEBUG) Log.i("PreferenceFragment", "onCreate() -> LogicAnalizerPrefsFragment");
        int res = getActivity().getResources().getIdentifier(getArguments().getString("logicprefsheaders"), "xml", getActivity().getPackageName());
        addPreferencesFromResource(res);
    }

そして、ヘッダーがある XML ファイルは次のとおりです。

R.xml.preference_header_logicanalizer:

<header
        android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
        android:icon="@drawable/settings"
        android:title="General" >
        <extra
            android:name="logicprefsheaders"
            android:value="logicgeneral" />
    </header>
    <header
        android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
        android:icon="@drawable/settings"
        android:title="Canal 1" >
        <extra
            android:name="logicprefsheaders"
            android:value="c1analizerprefs" />
    </header>
    <header
        android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
        android:icon="@drawable/settings"
        android:title="Canal 2" >
        <extra
            android:name="logicprefsheaders"
            android:value="c2analizerprefs" />
    </header>
    <header
        android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
        android:icon="@drawable/settings"
        android:title="Canal 3" >
        <extra
            android:name="logicprefsheaders"
            android:value="c3analizerprefs" />
    </header>
    <header
        android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
        android:icon="@drawable/settings"
        android:title="Canal 4" >
        <extra
            android:name="logicprefsheaders"
            android:value="c4analizerprefs" />
    </header>

これは、ヘッダーがクリックされたときに設定の 1 つを表示するために使用される私の xml ファイルの 1 つです。

c1analizerprefs.xml:

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

    <PreferenceCategory android:title="@string/AnalyzerProtocolTitle1" >
        <ListPreference
            android:defaultValue="0"
            android:entries="@array/protocolList"
            android:entryValues="@array/protocolValues"
            android:key="protocol1"
            android:summary="@string/AnalyzerProtocolSummary"
            android:title="@string/AnalyzerProtocolTitle1" />
        <ListPreference
            android:defaultValue="1"
            android:entries="@array/channelNames"
            android:entryValues="@array/protocolValues"
            android:key="SCL1"
            android:summary="@string/AnalyzerSCLSummary"
            android:title="@string/AnalyzerSCLTitle" />

        <EditTextPreference
            android:defaultValue="9600"
            android:title="@string/AnalyzerBaudTitle"
            android:key="BaudRate1"
            android:summary="@string/AnalyzerBaudSummary"
            android:inputType="number" />
    </PreferenceCategory>

</PreferenceScreen>

したがって、大きな画面では、期待どおりにこの結果が得られ、1 つの PreferenceFragment のみを使用して 4 つのヘッダーを追加します。

しかし、c1analizerprefs.xml のような XML で定義された私の 4 つの設定はほとんど同じで、唯一の変更は数字 (例: Pref. 1、Pref. 2、...) であるため、使用できるように Java に追加したいfor() を使用して 4 つ以上の設定を追加する テキストが常に同じであるため、繰り返し回数を簡単に変更する 数値を変更するだけなので、この方法では設定ごとに 1 つの XML ファイルを作成する必要がなく、動的に作成しますジャワで。

XML ファイルを使用する代わりに、Java でヘッダーにプリファレンスを追加するにはどうすればよいですか? PreferenceFragment には、addPreferencesFromResource() または addPreferencesFromIntent() しかありません。設定オブジェクトを追加する方法はありますか?

4

4 に答える 4

6

誰かが実際にコードを探している場合に備えて...

次の例では、XML からいくつかのヘッダーを読み込み、プログラムで追加します。

PreferenceActivity内の最初のオーバーライドonBuildHeaders :

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.preference_headers, target);

    // Add layer as a new settings header
    Header header = new Header();
    header.title = "More Settings";
    header.summary = "Change even more settings";
    header.fragment = SettingsFragment.class.getName();

    Bundle b = new Bundle();
    b.putString("category", "MoreSettings");
    header.fragmentArguments = b;
    target.add(header);
}

次に、 PreferenceActivity内でonHeaderClickをオーバーライドします。どのヘッダーがクリックされたかを検出できるように、ヘッダーの fragmentArguments をフラグメントに渡すことに注意してください (カテゴリ)。

@Override
public void onHeaderClick(Header header, int position) {    
    this.startPreferencePanel(SettingsFragment.class.getName(), header.fragmentArguments, header.titleRes, header.title, null, 0);
}

次に、PreferenceFragmentオーバーライドonCreate 内で:

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

    if (savedInstanceState == null) {
        mCategory = getArguments().getString("category");
    }
    else {
        // Orientation Change
        mCategory = savedInstanceState.getString("category");
    }

    if (mCategory.equals("Map")) {
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences_map);
    }
    if (mCategory.equals("MoreSettings")) {
        // Load the preferences from an XML resource
        PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(getActivity());
        // add prefrences using preferenceScreen.addPreference()
        this.setPreferenceScreen(preferenceScreen);
    }
}

定義済みヘッダーの xml を表示する場合。

res/xml/preference_headers.xml

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header 
        android:fragment="com.appName.fragments.SettingsFragment"
        android:title="@string/pref_category_map_title"
        android:summary="@string/pref_category_map_sum" >
        <!-- key/value pairs can be included as arguments for the fragment. -->
        <extra android:name="category" android:value="Map" />
    </header>
</preference-headers>

res/xml/preferences_map.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_zoomToCurrentLocationOnStart"
        android:title="@string/pref_zoomToCurrentLocationOnStart_title"
        android:summary="@string/pref_zoomToCurrentLocationOnStart_sum"
        android:defaultValue="true" />
    <CheckBoxPreference
        android:key="pref_myLocation"
        android:title="@string/pref_myLocation_title"
        android:summary="@string/pref_myLocation_sum"
        android:defaultValue="true" />
</PreferenceScreen>
于 2014-01-15T15:37:05.493 に答える
4

ヘッダーを動的に追加するのは簡単ではありません。Androidのドキュメントに記載されているように:

Blockquote 典型的な実装では、loadHeadersFromResource(int, List) を使用して、リソースからリストを埋めます。

それでも動的ソリューションを使用したい場合は、loadHeadersFromResource のソース コードを確認することをお勧めします (たとえば、ここhttp://grepcode.com/file/repository.grepcode.com/java/ext/com .google.android/android/4.0.1_r1/android/preference/PreferenceActivity.java#PreferenceActivity.loadHeadersFromResource(int%2Cjava.util.List) )

総括する、

  1. PreferenceActivity.Header オブジェクトを作成する必要があります。

  2. ドキュメントにあるさまざまなプロパティを設定して、使用できるように準備します: http://developer.android.com/reference/android/preference/PreferenceActivity.Header.html

  3. 最後に、作成したヘッダーをリストに追加しますtarget.add(header);(ターゲットは、onBuildHeaders に渡される引数です)。

于 2013-04-10T13:42:29.047 に答える
1

うまくいけば、私はあなたの質問を誤解していません:

getPreferenceScreen().addPreference( preference );
于 2013-04-08T03:10:52.673 に答える
0

@goodies4uallによる素晴らしい回答

onHeaderClick() で特別なことをする必要がないことを (まだ投稿を編集できないため) 追加するだけです。

onBuildHeaders() の外側にヘッダーを追加したい場合は、ヘッダーを無効にして、onBuildHeaders() が次に起動するときに新しいヘッダーを追加できるようにすることをお勧めします (invalidateHeaders により、onBuildHeaders が再度起動されます)。

private boolean flagToAddMyNewHeader = false;

public void someEventFiredThatRequiresANewHeader() {
    flagToAddMyNewHeader = true;
    invalidateHeaders();
}

そして、あなたの onBuildHeaders:

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.preference_headers, target);

    if (flagToAddMyNewHeader) {
        flagToAddMyNewHeader = false;

        Header header = new Header();
        header.titleRes = R.string.my_new_header_title;
        header.iconRes = R.drawable.my_new_header_icon;
        header.fragment = MyNewHeaderFragment.class.getName();

        Bundle b = new Bundle();
        b.putString("category", "MyNewHeader");
        header.fragmentArguments = b;

        // inserts my new header as the 2nd entry
        target.add(1, header);
    }
}
于 2016-02-20T05:20:34.690 に答える