2

私はAndroidのPreferenceシステムにはかなり新しく、現在問題に直面しています。サブレイアウトを強制的にフラグメントのレイアウト(Android)に含めるには

Android Guide(http://developer.android.com/guide/topics/ui/settings.html)の指示に従って、私はPreference Fragmentを使用します。したがって、私のSettingsActivityにはいくつかの項目(タイトル、タブなどのヘッダー)と下のPreferenceFragmentが含まれています。

"サブ" PreferenceScreenに関連付けられたプリファレンスをクリックすると、「新しいプリファレンス画面」はフラグメントのレイアウトを尊重するのではなく、アクティビティ全体を満たします。

ここでは例として、addPreferenceFromResource(R.xml.preferences)を呼び出すPreferenceFragmentがあるとします。 preferences.xmlには、 "Change password"プリファレンスが含まれています。これは、3つのTextEditPreferenceを含むPreferenceScreenです。 The entire activity is filled by the preferenceScreen

しかし、私は、それはそれをしたい:私は行うことができますどのように enter image description here

私はPreferenceScreenをクリックしたとき

あるpreferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <EditTextPreference android:title="@string/pref_one"/> 
    <EditTextPreference android:title="@string/pref_two"/> 

    <PreferenceScreen android:title="@string/pref_change_password"> 

     <EditTextPreference android:title="@string/pref_current_pass" 
      android:inputType="textPassword" 
      android:hint="@string/hint_current_password" /> 

     <EditTextPreference android:title="@string/pref_new_pass" 
      android:inputType="textPassword" 
      android:hint="@string/hint_new_password" /> 

     <EditTextPreference android:title="@string/pref_confirm_new_pass" 
      android:inputType="textPassword" 
      android:hint="@string/hint_confirm_new_password" /> 

    </PreferenceScreen> 
</PreferenceScreen> 

だから、それはこのありませんそれ? お返事ありがとうございます!

答えて

2

Android Referenceの深いダイビングの後、解決策が見つかりました。

サブPreferenceScreenをクリックすると、新しいPreferenceオブジェクトを含むダイアログが開き、新しいアクティビティなどは表示されないようです。

したがって、解決策はダイアログを取得し、元のPreferenceFragmentのレイアウトに合わせることです。

public class SettingsFragment extends PreferenceFragment { 

    // onCreate and other stuff... 

    @Override 
    public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, 
              Preference preference) { 

     // Initiating Dialog's layout when any sub PreferenceScreen clicked 
     if(preference.getClass() == PreferenceScreen.class) { 
      // Retrieving the opened Dialog 
      Dialog dialog = ((PreferenceScreen) preference).getDialog(); 
      if(dialog == null) return false; 

      initDialogLayout(dialog); // Initiate the dialog's layout 
     } 
     return true; 
    } 

    private void initDialogLayout(Dialog dialog) { 
     View fragmentView = getView(); 

     // Get absolute coordinates of the PreferenceFragment 
     int fragmentViewLocation [] = new int[2]; 
     fragmentView.getLocationOnScreen(fragmentViewLocation); 

     // Set new dimension and position attributes of the dialog 
     WindowManager.LayoutParams wlp = dialog.getWindow().getAttributes(); 
     wlp.x  = fragmentViewLocation[0]; // 0 for x 
     wlp.y  = fragmentViewLocation[1]; // 1 for y 
     wlp.width = fragmentView.getWidth(); 
     wlp.height = fragmentView.getHeight(); 

     dialog.getWindow().setAttributes(wlp); 

     // Set flag so that you can still interact with objects outside the dialog 
     dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
    } 
} 

そして、それはそれだ、トリックを作っている。そうするために、私はPreferenceScreenがクリックされたかどうかを検出するためにonPreferenceTreeClickコールバックメソッドを使用していました。より良い方法があると思ったらコメントしてください。

+0

その作業。影はない。あなたはアクションバーのアイコンを元に戻す必要があります。 – motis10

関連する問題