2012-07-08 83 views
50

我試圖完成一些我認爲很容易的事情,但是我對使用PreferenceActivity類和xml首選項標記標記如何實現它感到困惑。Single page PreferenceActivity w/no headers/fragments?

當用戶點擊應用程序設置圖標時,我想讓它們顯示一個複選框和列表的小列表。我只有一個偏好片段。到目前爲止,我可以設置PreferenceActivity xml文件(preferences.xml和首選項片段xmls)來顯示首選項片段的單個標頭。當用戶選擇該標題時,首選項屏幕正是我想要的,然而,我無法找出一種方法來跳過顯示第一個標題屏幕。

看起來很浪費必須點擊設置/首選項圖標,顯示一個單一的標題,然後點擊以獲得實際的設置/偏好。

我明白,如果您想對您的偏好進行分類,這會非常有幫助,但對於簡單的事情來說,這會增加開銷並且看起來相當笨拙。

我希望我很清楚。簡而言之,這是我的問題:

什麼是使用PreferenceActivity類和首選標題標籤簡單地顯示一個沒有標題的選項屏幕的新首選方式?

環顧了一番後,它看起來像我正試圖做一些直接前進的方法。我試圖做到這一點,而不使用任何不推薦使用的函數。

由於提前, B.

+1

我有類似的要求。結束使用此解決方案https://stackoverflow.com/a/10960720/276263 – krishnakumarp 2017-09-14 16:34:28

回答

22

我一直在尋找匹配該問題的答案。最終,我從其他幾個來源處理出來。對於那些可能仍然需要它回答的問題,這裏是對我有用的。 (注 - 在此項目中min和target SDK都設置爲15)。

  1. 轉儲PreferenceHeaders,您不需要它們。
  2. 使用單頁設置創建首選項屏幕。
  3. 創建一個偏好活動類(下面的SettingsActivity)。
  4. 創建一個內聯類擴展PreferenceFragment(LocationFragment below)。
  5. 在Manifest中定義類。
  6. 開始任務 - 請參閱下面的菜單代碼。

顯示單個設置屏幕的首選項類。

public class SettingsActivity extends PreferenceActivity { 

    private final static String TAG = "SettingsAcitivity"; 

    public SettingsActivity() {} 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MyLog.d(TAG, "onCreate"); 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new LocationFragment()).commit(); 
    } 

    public class LocationFragment extends PreferenceFragment { 

     private final static String TAG = "LocationFragment"; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      MyLog.d(TAG, "onCreate"); 
      addPreferencesFromResource(R.xml.locationsettings); 
     } 
    } 
} 

的代碼,以顯示設置:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    MyLog.d(TAG, "onOptionsItemSelected"); 
    switch (item.getItemId()) { 
    case R.id.menu_main_help: 
     break; 
    case R.id.menu_main_about: 
     break; 
    case R.id.menu_main_settings: 
     MyLog.d(TAG, "Settings"); 
     Intent settingsIntent = new Intent(this, SettingsActivity.class); 
     startActivity(settingsIntent); 
     break; 
    } 
    return true; 
} 

返回鍵終止SettingsActivity。內置的首選例程保存所有更改。我有一個getSettings()函數,用於更新調用活動使用的任何更改設置(本例中爲MainActivity)。

就是這樣。

+0

如果您仍然看到Fragmant頂部的舊標題,請確保刪除'onBuildHeaders()'方法。 – iTurki 2017-09-04 17:01:06

77

新的首選方法是將單個PreferenceFragment顯示爲任何活動的主要內容。它不需要是PreferenceActivity。查看API演示示例

public class FragmentPreferences extends Activity { 

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

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


    public static class PrefsFragment extends PreferenceFragment { 

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

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.preferences); 
     } 
    } 

} 
+0

由於在API 11中添加了getFragmentManager()方法,因此無法在較低的API 11上運行。 – 2013-12-02 07:38:13

+0

如果您使用支持庫,則可以調用getFragmentManager()。 – TheIT 2013-12-09 23:10:12

+0

yup!很好的解決方案..我沒有意識到,PreferenceFragment也可以使用,而不是嵌套在PreferenceActivity中! ;) – 2014-06-30 14:07:39