11

我已經實現了我的偏好,如官方指南中所示。在子屏幕首選項中顯示按鈕在actionBar中

我有創建PreferenceFragment這樣的PreferenceActivity:

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

     Bundle extras = getIntent().getExtras(); 
     if (extras != null) 
     { 
      Bundle bundle = new Bundle(); 
      _widgetID = extras.getInt(GlobalSettings.EXTRA_WIDGET_ID); 
      bundle.putInt(GlobalSettings.EXTRA_WIDGET_ID, _widgetID); 

      WidgetSettingsFragment fragment = new WidgetSettingsFragment(); 
      fragment.setArguments(bundle); 

      getFragmentManager().beginTransaction().replace(android.R.id.content, 
         fragment).commit(); 
     } 

} 

的PreferenceFragment從資源加載的喜好和它們所包含的偏好子屏幕是這樣的:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- opens a subscreen of settings --> 
    <PreferenceScreen 
     android:key="button_voicemail_category_key" 
     android:title="@string/voicemail" 
     android:persistent="false"> 
     <ListPreference 
      android:key="button_voicemail_provider_key" 
      android:title="@string/voicemail_provider" ... /> 
     <!-- opens another nested subscreen --> 
     <PreferenceScreen 
      android:key="button_voicemail_setting_key" 
      android:title="@string/voicemail_settings" 
      android:persistent="false"> 
      ... 
     </PreferenceScreen> 
     <RingtonePreference 
      android:key="button_voicemail_ringtone_key" 
      android:title="@string/voicemail_ringtone_title" 
      android:ringtoneType="notification" ... /> 
     ... 
    </PreferenceScreen> 
    ... 
</PreferenceScreen> 

這種運作良好,因此遠,但現在我想在顯示首選項子屏幕時在actionBar中有一個up-Button。任何想法如何實現?

我試圖在我的活動中設置setDisplayHomeAsUpEnabled(true),但隨後上行按鈕僅顯示在主偏好設置中(不應該在此處顯示),而不顯示在子屏幕中。

我不知道,即使是在官方的文檔的子屏幕是不活躍上行按鈕顯示: Setting subscreens

鏈接到文檔:Settings

任何幫助真的歡迎

+0

據我所知,根據谷歌的設計建議,系統後退按鈕比這種情況下的上行導航更適合。否則,如果您創建了自己的新Activity,那麼可以使用getActionBar()。setDisplayHomeAsUpEnabled(true)來完成特定的子屏幕活動。 – webuster

+0

有幾乎完全相同的問題:http://stackoverflow.com/questions/11971800/sethomebuttonenabled-on-preferenceactivity-and-nested-preference – Mdlc

+2

問題是,我只有一個'PreferenceFragment'顯示偏好和自動偏好的子屏幕。我沒有子屏幕的活動或片段類。我不知道如何檢查子屏幕是否顯示,以便調用'setDisplayHomeAsUpEnabled(true)',因爲我沒有看到這個接口或回調。 – user1567896

回答

12

我終於明白了:D。這是相當黑客,但它的作品。

問題是,在xml-layouts中使用子屏幕會導致一些「代碼魔法」。 爲子屏幕啓動一個新的活動/對話框,並且您無法直接訪問它。

要訪問操作欄和家庭/向上按鈕的OnClickListener,您需要獲取對PreferenceScreen的引用並獲取其父對話框以訪問操作欄及其主頁/向上按鈕。

這是它是如何我PreferenceFragment內部完成:

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

final PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference(getString(R.string.keyPrefScreenDynamicWidgetDetails)); 
    preferenceScreen.setOnPreferenceClickListener(new OnPreferenceClickListener() 
    { 
     public boolean onPreferenceClick(Preference preference) 
     { 
      preferenceScreen.getDialog().getActionBar().setDisplayHomeAsUpEnabled(true); 
      final Dialog dialog = preferenceScreen.getDialog(); 

      View homeBtn = dialog.findViewById(android.R.id.home); 
      if (homeBtn != null) 
      { 
       OnClickListener dismissDialogClickListener = new OnClickListener() 
       { 
        @Override 
        public void onClick(View v) 
        { 
         dialog.dismiss(); 
        } 
       }; 

       // Prepare yourselves for some hacky programming 
       ViewParent homeBtnContainer = homeBtn.getParent(); 

       // The home button is an ImageView inside a FrameLayout 
       if (homeBtnContainer instanceof FrameLayout) { 
        ViewGroup containerParent = (ViewGroup) homeBtnContainer.getParent(); 

        if (containerParent instanceof LinearLayout) { 
         // This view also contains the title text, set the whole view as clickable 
         ((LinearLayout) containerParent).setOnClickListener(dismissDialogClickListener); 
        } else { 
         // Just set it on the home button 
         ((FrameLayout) homeBtnContainer).setOnClickListener(dismissDialogClickListener); 
        } 
       } else { 
        // The 'If all else fails' default case 
        homeBtn.setOnClickListener(dismissDialogClickListener); 
       }     
      } 
      return true; 
     } 
    }); 
... 

} 

以下鏈接給我最後的提示和代碼來解決我的問題:

Action Bar Home Button not functional with nested PreferenceScreen

+1

聰明但hacky,可能不便攜。它依賴於你不控制的對話的實現細節。 –

3

我按照「支持具有偏好標題的舊版本」部分http://developer.android.com/guide/topics/ui/settings.html#BackCompatHeaders中的Android文檔執行此操作。使用傳統的PreferenceActivity,您可以在xml中指定一個偏好,以便向相同的偏好活動類發起一個意向。該活動檢查意圖操作並確定它是否嵌套(顯示向上按鈕)以及在屏幕中膨脹哪個首選項xml。

當然,我也打算支持較舊的設備。我發現PreferenceFragment僅適用於使用偏好標題的大型平板電腦。

要重新使用手機和平板電腦之間的喜好,我想出了這個解決方案https://stackoverflow.com/a/20806812/1139784

-5

爲了使後續行動執行以下操作:

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setDisplayUseLogoEnabled(true); 

這會給你的圖標。

再加入

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      finish(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

你可以改變此去哪裏你需要。作爲另一種選擇,您可以使用navigateUpTo(Intent intent)和onSupportNavigateUpTo(Intent intent)方法並指定要返回的意圖。

+0

感謝您的回答,但這不是我的問題的答案 – user1567896

相關問題