2013-04-01 20 views
4

我有PreferenceFragment和PreferenceActivity從中我從一個XML文件,在這種方式添加標題:如何將Header和Preference對象添加到PreferenceActivity中,而不是使用XML文件,而是使用Java?

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); 
    } 
} 

PreferenceFragment:

@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> 

這是它是用來顯示一個首選項點擊一個標題時,我的XML文件之一:

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> 

所以在大屏幕我有this結果如預期,我只用一個PreferenceFragment加我4頭。

但我在XML中定義的四個首選參數(如c1analizerprefs.xml)幾乎相同,唯一的變化就是一個數字(例如:Pref.1,Pref.2,...),所以我想在Java中添加它們所以我可以使用for()添加4個或更多的首選項,輕鬆地改變重複次數,因爲文本總是相同的,所以我只需要改變一個數字,這樣我就不需要爲每個首選項創建一個XML文件,我使用Java動態創建它們。

如何在Java中爲首部添加首選項而不是使用XML文件?在PreferenceFragment中,我只有addPreferencesFromResource()或addPreferencesFromIntent()。有什麼方法可以添加首選對象?

回答

3

添加頁眉動態並不容易。正如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。標題對象,

  2. 用於通過設置它的各種性質的使用,可以在文檔中找到製備它:http://developer.android.com/reference/android/preference/PreferenceActivity.Header.html

  3. 最後創建報頭添加到列表中:target.add(header);(目標是傳遞的參數到onBuildHeaders)

+0

非常感謝!那正是我期待的! – Andres

+0

只是一個側面說明,我不認爲自己是一個專家,我覺得它很容易。 – goodies4uall

1

希望我沒有誤解你的問題:

getPreferenceScreen().addPreference(preference); 
+0

如果我的理解是,在這樣,我添加的偏好不是頭(http://goo.gl/PZQNQ)調用一個當它被點擊時的片段:) – Andres

+0

我不知道你剛剛說了什麼 –

+0

我需要做的是在我的PreferenceActivity中添加Headers以在智能手機上的平板電腦和單面板視圖上顯示雙面板視圖。這是通過使用帶有

標籤的XML文件完成的,您可以在單擊標題時指定要調用的片段,但我希望使用addPreferencesFromResource()從Java文件中添加標題,而不是使用addPreferencesFromResource()從XML文件添加標題。例如addPreferencesFromResource()就像addHeader(new Header()); – Andres

5

萬一有人實際上是在尋找一些代碼...

下面的示例加載的XML和T一些頭母雞以編程方式附加到他們身上。

1日覆蓋onBuildHeadersPreferenceActivity內:

@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); 
} 

然後覆蓋onHeaderClickPreferenceActivity內。請注意,您通過頭部的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> 
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); 
    } 
} 
相關問題