0

XML で定義された 2 ペイン ビューがあります。xlarge の場合、ビューの左側は、コンテンツの選択を処理する Fragment です。このセレクターを初期化ListFragmentして、アプリの起動時に最初の項目が強調表示されるようにします。

私はListFragmentこれを行うためのメソッドを書きました:

public void setSelectedItem (int position) {
    //Unselect the previous item
    if(mPreviousPosition != ListView.INVALID_POSITION) {
        View oldSelected = getListView().getChildAt(mPreviousPosition);
        oldSelected.setBackgroundResource(R.drawable.menu_button);
        ((ImageView) oldSelected.findViewById(R.id.selector_icon)).setImageDrawable(icons.getDrawable(mPreviousPosition));
        ((TextView) oldSelected.findViewById(R.id.selector_text)).setTextAppearance(getActivity(), R.style.text_selector);
    }

    //Select this item
    View newSelected = getListView().getChildAt(position);
    newSelected.setBackgroundResource(R.drawable.menu_button_active);
    ((ImageView) newSelected.findViewById(R.id.selector_icon)).setImageDrawable(icons_active.getDrawable(position));
    ((TextView) newSelected.findViewById(R.id.selector_text)).setTextAppearance(getActivity(), R.style.text_selector_active);

    mPreviousPosition = position;
}

アイテムが選択された後にこれを呼び出すと、うまく機能します。しかし、起動時に最初の項目を強調表示しようとすると、NPE が発生します。

newSelected.setBackgroundResource(R.drawable.menu_button_active);

フラグメントのビューがまだ作成されていないため、getListView().getChildAt(position)戻ってきているようです。null

それで、私のアクティビティのどこから初期化を試みても安全ListFragmentですか?onStart、onRestoreInstanceState、および onResume で試しましたが、すべて NPE が生成されます。

4

2 に答える 2

0

ListView に入力するフラグメント コールバックを指定しませんでした。とにかく、アクティビティの状態とフラグメントの状態を比較するこの図は、おそらくあなたを助けることができます:

フラグメント状態と比較したアクティビティ状態

于 2012-08-01T14:01:38.093 に答える
0

私が理解していることから、2 つのペイン (左側のペインは ListFragment) があり、これら 2 つのフラグメントは FragmentActivity 内に保持されます。フラグメントは、FragmentActivity の xml レイアウトで設定されています。フラグメントは onAttach() サイクルの後に FragmentActivity で使用できますが、これは必ずしも子フラグメントのビュー要素がまだ使用可能であることを意味しません。

最初の質問は、選択したアイテムをどこに設定しようとしているのかです。FragmentActivity または ListFragment で? onResume() メソッドの ListFragment で処理する必要があります。

ListFragment での選択に基づいて、適切なフラグメントに選択用のデータを入力していると思います。フラグメント アクティビティと基礎となるフラグメント間の依存関係を回避するためにリスナーを使用する良い例を提供するこのリンクを参照することをお勧めします。

http://developer.android.com/training/basics/fragments/communicating.html

その後、リスナーを使用して ListFragment 内の選択を処理し、選択を正しいフラグメントに渡すことができます。右側のフラグメントでは、FragmentActivity での選択を確認したり、フラグメントを登録して選択をリッスンしたりできます。このようにして、正しいフラグメントがリスナーとして登録される前に選択が発生する状況をカバーする必要があります。

UDPATE

詳細についてはレスポンシブ レイアウト デザインを参照してください。

/res
    /values
       bool.xml
    /values-sw600dp-land
       bools.xml

次に、bools.xml ファイル内で isDualPane の値を定義します。

<resources>
    <bool name="isDualPane">[true/false]</bool>
</resources>

次に、listFragment のコードで bools リソースを参照し、レイアウトが何であるかを知ることができます。

isDualPane = getResources().getBoolean(R.bool.isDualPane);

また、これを任意のクラスで使用して、クラス間の依存関係を作成する必要なく、レイアウトが何であるかを知るという利点もあります。

ここに役立つリンクがいくつかあります。

http://developer.android.com/training/multiscreen/screensizes.html http://developer.android.com/training/multiscreen/adaptui.h​​tml

于 2012-08-09T14:39:38.540 に答える