2017-01-17 3 views
9

で動作します。 以下のアニメーションGIFからわかるように、私は後退してレイアウトをもう一度やり直す必要があります。今はなぜですか?優先画面カスタムレイアウトだけで、私は「カスタムレイアウト」を使って好みの画面を持ってもう一度クリック

enter image description here

あるpreferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:key="application_preferences"> 
    <PreferenceCategory> 
     <PreferenceScreen 
       android:key="url_settings" 
       android:title="@string/url_settings" 
       android:summary="@string/summary_url_settings"> 
     </PreferenceScreen> 

     <PreferenceScreen 
       android:key="currency_codes" 
       android:title="@string/left_handed" 
       android:summary="@string/summary_left_handed"> 
      <Preference 
        android:key="currency_exchanges" 
        android:layout="@layout/currencycodes"/> 
     </PreferenceScreen> 
     <EditTextPreference 
       android:key="url_exchange_rate" 
       android:title="@string/url_exchange_rate_settings" 
       android:summary="@string/summary_url_exchange_rate" 
       android:enabled = "false"/> 
    </PreferenceCategory> 
</PreferenceScreen> 

以下は、使用されるカスタムレイアウトです。これにはGridViewが含まれています。

currencycodes.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/activity_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     tools:context=".MainActivity"> 

    <GridView 
      android:layout_width="328dp" 
      android:layout_height="479dp" 
      android:layout_marginTop="16dp" 
      app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="16dp" 
      app:layout_constraintLeft_toLeftOf="parent" android:layout_marginEnd="16dp" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="16dp" 
      android:id="@+id/grdExchanges" android:scrollbars="horizontal|vertical" 
      android:smoothScrollbar="true" tools:textAlignment="center" 
      android:verticalScrollbarPosition="defaultPosition"/> 
</android.support.constraint.ConstraintLayout> 
+0

としてのjavaを追加してくださいよく –

答えて

1

私は回避策を思いついた。 LayoutInflater.javaでレイアウトを膨らませるとき、私は、静的なハッシュマップはビューオブジェクトを収集するために使用され、注意:何が起こっている

private static final HashMap<String, Constructor<? extends View>> sConstructorMap 

は、最初のクリックがLayoutInflaterを呼び出すことですが、その最初のクリックだけでGridViewのビューを追加します静的ハッシュマップ。あなたが最初のクリックで、それを参照してくださいよ、コマンド、sConstructorMap.get(name)は、のみnullを返します:LayoutInflaterで

public final View createView(String name, String prefix, AttributeSet attrs) 
     throws ClassNotFoundException, InflateException { 

    Constructor<? extends View> constructor = sConstructorMap.get(name); 

    Class<? extends View> clazz = null; 

     try { 

      if (constructor == null) { 

を、変数、mPrivateFactoryは、実際にあなたの主な活動です。それは私のgridviewがmPrivateFactory.onCreateView()で初期化されることです。しかし、最初のクリックで、mPrivateFactory.onCreateView()はnullを返します。なぜなら、静的ハッシュマップにはgridviewのビューがないからです。 、特に好ましくはクリックされたことを二度初めて、私はよりエレガントな解決策を考え出したまで、私は単にメソッドを呼び出すので

if (view == null && mPrivateFactory != null) { 
     view = mPrivateFactory.onCreateView(parent, name, context, attrs); 
    } 

    if (view == null) { 
     final Object lastContext = mConstructorArgs[0]; 
     mConstructorArgs[0] = context; 
     try { 
      if (-1 == name.indexOf('.')) { 
       view = onCreateView(parent, name, attrs); <-- ADD TO STATIC HASHMAP 
      } else { 
       view = createView(name, null, attrs); 
      } 
     } finally { 
      mConstructorArgs[0] = lastContext; 
     } 
    } 

onCreateView(parent):それは、それが最終的に追加されonCreateView(parent, name, attrs);コマンドラインにさらに以下ですに。最初の呼び出しは、2回目の呼び出しは、その後、レイアウトビュー(再び)をインスタンス化しますが、この時、私自身の活動の独自のonCreateView方法でGridViewコントロールを初期化し、mPrivateFactory.onCreateView()、静的ハッシュマップにGridViewコントロールを追加します。

protected View onCreateView(ViewGroup parent) { 

View layout = super.onCreateView(parent); 

if(firstCall){ 

    firstCall = false; 

    layout = super.onCreateView(parent); 
} 

return layout; 
} 
1

(mFragMngr.findFragmentByTag(fragName) == null) 
+0

設定ギアボタンが既に押されているか、フラグメントが既に表示されているかどうかを判断するだけです。率直に言って、この問題とは何の関係もありません。 – Drawn

2

あなたはどのようにPreferenceScreen作品を理解するために必要なすべてのまあ最初に

(!mFragMngr.popBackStackImmediate(fragName, 0) 
       && mFragMngr.findFragmentByTag(fragName) == null) 

からあなたifステートメントを変更してみてください? 【Androidのドキュメント]から

[1]:それは別の優先階層の内部に表示されたら

、それが示されており、 優先の他の画面へのゲートウェイとして機能する(いずれか によって好みの別の画面が表示されていますダイアログとして、またはgetIntent()からのstartActivity(android.content.Intent)を介して)。このPreferenceScreenの子どもの は、 このPreferenceScreenが表示されている画面には表示されません。代わりに、この環境設定をクリックすると別の画面が表示されます。 簡単な言葉で

、優先階層からこれらの他の画面例を示す

嗜好フレームワークハンドル。 このPreferenceScreenタグは、スクリーンブレイクとして機能します(ワープロのページ区切りに似ています)。他のプリファレンスタイプの場合と同様に、ここでキーを割り当てて、インスタンス状態を保存および復元できるようにします。あなたのケースでは

は、どのような実際に起こっては「application_preferencesは、」環境設定「Url_Setting」と「通貨コードが表示されますPreferenceActivity.The最初の画面に階層のルートとして使用して与えられますです" 「second_preferencescreen」で、クリックされたとき、「が通貨コードは」通貨コードすなわち「second_preferencescreen」タグの子としてそれの好みとして(「両替」で好みの別の画面が表示されます)。なぜその最初のクリックで....が、第2クリックで表示されないように

は、あなたはまだ疑問を持っている場合...私に知らせて

...あなたは好みの画面がどのように機能するか を得たいと考えています。 .. https://developer.android.com/reference/android/preference/PreferenceScreen.html

+0

この特定の問題を考慮せずにPreferenceScreenのドキュメントを朗読しています。最初のクリックでなぜ表示されないのか? 「通貨コード」は「second_preferencescreen」ではなく3番目のものです。 2番目は "url_settings"で、正常に動作します。 – Drawn

+0

@drawn通貨コードは、通貨交換のための別の設定キーを持っているあなたのコードには2番目の設定screen.Accordingですあなたが参照してください参照してください参照してください。私はこれをドキュメントから引用していますので、公式ドキュメントが優先階層について言うものを知っています。 。それはいつも優先順位階層とスクリーンについてです。ルート階層は最初にあなたのapplication_preference.givenであるとカウントされません。希望活動に。希望は私のポイントを得ました。それはすべて優先順位階層に関するものです。インデックス作成。あなたの問題はどこにあるのですか? – PN10

+0

URL_settingsは最初の設定画面として機能しますが、通貨コードは別の設定を持つ第2の設定画面です。その画面にはiCurrency Exchange ...あなたの設定画面の順序を表示します...ここ... – PN10

関連する問題