9

2 つのフラグメントを含むレイアウトがあります。左側のフラグメントは、SimpleCursorAdaptor を使用した ListFragment です。右側のフラグメントには、左側のフラグメントのリストから選択された項目に関する詳細が入力されます。リスト内の別の項目が選択されるまで、ListFragment から選択された項目が強調表示されたままになるようにする方法を理解しようとしています。

いくつかの調査の後、使用しようとしている限りandroid:background="@drawable/item_selector"、さまざまな状態の色を変更できますが、どれも持続していないようです。私は選択されたものだと思っていました...別のアイテムを選択するまで、選択したアイテムが選択されたままになるのは論理的なようです。

状態を維持できることを期待して、クリックハンドラーで使用しようとしv.setSelected(true);ましたが、それも機能しませんでした。

私が行方不明の州はありますか?私は開発ドキュメントを調べましたが、他に適切なものはありませんでした...

item_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_pressed="true" 
        android:drawable="@color/green" />
    <item 
        android:state_selected="true" 
        android:drawable="@color/blue" />
</selector>

他にどのコードが役立つかはわかりませんので、他に必要と思われるものは何でもお気軽にお尋ねください。

4

3 に答える 3

12

答えは、さらに調査した後のAndroidドキュメントにありました(実際にはドキュメントの2つの部分)。

まず、タッチ モードでは、選択状態やフォーカス状態はありません。

次に、デフォルトでは、リストビューは選択モードが none に設定されています (つまり、リスト内のどの項目も選択状態にならないということです)。私がしなければならなかったのは、これを追加して選択モードを変更することでした(単一または複数の可能性があり、単一が必要/欲しかっただけです):

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

次に、セレクター XML で選択状態を使用しました (状態に変換しactivatedます)。

<item 
 android:state_activated="true" 
 android:drawable="@color/blue" />

それを背景として行レイアウト xml ファイルに適用します。

   <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:background="@drawable/item_selector"
    android:gravity="center_vertical"/>

選択したアイテムは、別のアイテムが選択されるまで青色の背景で表示されるようになりました。

この (android:state_activated) には Android API 11 以降が必要であることに注意してください。

于 2012-04-08T16:31:20.607 に答える
1

選択または強調表示されているようにするには、 state_focusedも追加する必要があると思います。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_pressed="true" 
        android:drawable="@color/green" />
    <item 
        android:state_selected="true" 
        android:drawable="@color/blue" />

    <item 
        android:state_focused="true" 
        android:drawable="@color/red" />
</selector>
于 2012-04-05T06:58:16.490 に答える
0

これは で非常にうまく機能しましたがListFragment、Android 4.0 以降でしか機能しないと思います。リスト項目の簡単なレイアウトを作成しましたandroid:background="?android:attr/activatedBackgroundIndicator(4.0 未満の Android の場合、ドローアブルで同様のものを作成する必要があります)。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:background="?android:attr/activatedBackgroundIndicator"
android:orientation="horizontal" >

<TextView
    android:id="@+id/list_item_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:singleLine="true"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:layout_margin="@dimen/double_view_margin" />

次に、このレイアウトを使用して単純なレイアウトを作成しArrayAdapter、選択モードを単一に設定します。

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels);

setListAdapter(labelsAdapter);

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

その後、次のsetItemCheckedメソッドで必要な項目を強調表示できます。

@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
    getListView().setItemChecked(position, true);
}
于 2014-09-24T18:29:44.337 に答える