42

Android Studio を使用して Navigation Drawer を実装しましたが、現在変更中のセクションを示すために使用される青色を取得できません。

私は多くのことを試しましたが、現在次のような listSelector を使用しています:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true" android:drawable="@color/selected" />
    <item android:state_pressed="true" android:drawable="@color/highlight" />


</selector>

私も試しstate_checkedました。state_pressedこの状況では機能しますが、現在選択されているアイテムはまだ青色です。

編集:私はこれをさらに調べており、アダプターが作成されたときに渡されるコンテキストはgetActionBar().getThemedContext()、アクションバースタイルに割り当てる適切な属性を見つけることができれば、そこから変更できると考えています. いくつかの異なる属性を試しましたが、うまくいきませんでした。正確な属性を知っている人はいますか?

私も気づいた

<item name="android:activatedBackgroundIndicator">@drawable/nav_listview_selector</item>

私のテーマの主要部分で色getActionBar().getThemedContext()getActivity.getBaseContext変更できますが、これは正しい方法ではないと思います。テーマコンテキストを使用する必要があると思います。したがって、誰かがどこactivatedBackgroundIndicatorに置くことができるかを知っていれば、それを使用することができますgetActionBar.getThemedContext()

EDIT2:

したがって、リストビューに使用されるテキスト ビューは SDK 内のもので、次のようになります。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>

だから私"?android:attr/activatedBackgroundIndicator"はテーマレベルで変更しようとしましたが、チェック/選択/アクティブ化には効果がありませんが、押された場合には効果があります。これがなぜなのか誰か知っていますか?どうすれば変更できますか?

4

13 に答える 13

10

これは私のために働いています:

  1. 最初にドローアブルitem_bg.xmlを次のように定義します。

    <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:state_checked="true" android:drawable="@drawable/nav_menu_bg" />
        </selector>
    
  2. 次に、このドローアブルを次のように使用しますnavigation_main_layout.xml

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:itemBackground="@drawable/item_bg"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_navigation"
        app:menu="@menu/navigation_main_layout_drawer" />
    
于 2016-06-24T12:52:39.447 に答える
6

これが私が行った方法であり、機能しています。簡単な概念は、アダプターで選択したアイテムの位置を維持し、メソッドを呼び出すときに呼び出すことです。ビューを取得して、選択した位置の位置を確認し、背景ビューを変更します。コードは次のとおりです。notifyDataSetChangednotifyDatasetChangedgetView

NavigationDrawer リスト ビューのアダプタ

public class MenuAdapter extends BaseAdapter {

private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private Context mContext;
private String name;
private int profile;
private int mIcons[];
private int selectedPosition = 0;
private String mNavTitles[];
private LayoutInflater mInflater;

public MenuAdapter(String titles[], int icon[], String Name, int profile) {
    mNavTitles = titles;
    mIcons = icon;
    name = Name;
    this.profile = profile;
}

public MenuAdapter(String Titles[], int Icons[], Context mContext) {
    mNavTitles = Titles;
    mIcons = Icons;
    this.mContext = mContext;
    mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return mNavTitles.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    convertView = mInflater.inflate(R.layout.item_row, parent, false);

    TextView textView = (TextView) convertView.findViewById(R.id.rowText);
    ImageView imageView = (ImageView) convertView.findViewById(R.id.rowIcon);
    final LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.outerLayout);

    imageView.setImageResource(mIcons[position]);
    textView.setText(mNavTitles[position]);

    if (position == selectedPosition)
        layout.setBackgroundColor(mContext.getResources().getColor(R.color.app_bg));
    else  
      layout.setBackgroundColor(mContext.getResources().getColor(R.color.normal_bg));

    return convertView;
}

public void setSelectedPosition(int position) {

    this.selectedPosition = position;

}


}

あなたの活動でこれを行います

 private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) { 
        mMenuAdapter.setSelectedPosition(position - 1);
        mMenuAdapter.notifyDataSetChanged();
    }
}

それでも問題が解決しない場合は、お気軽にお問い合わせください。

于 2015-07-29T10:17:38.513 に答える
0

listSelector にカスタム セレクター ドローアブルを提供するだけでなく、リスト項目のバックグラウンド リソースを、異なる状態に対して異なるドローアブルを持つ同様のセレクター ドローアブルに設定する必要があります。

于 2014-03-13T11:35:50.233 に答える
0

遅すぎることはわかっていますが、アプリでこの問題を解決しました。

「state_pressed」の位置を一番上に変更するだけです。

<item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
<item android:drawable="@drawable/list_item_bg_selected" android:state_activated="true"/>
于 2015-02-07T12:55:13.277 に答える
0

なぜそれが機能しないのかはまだわかりません。しかし、私が見つけた方法は、独自のsimple_list_item_activatedレイアウトを使用して ArrayAdapter に渡すことです。これは、テキストの色を白に設定する以外は基本的に同じです。その後、に置き換えましgetActionBar().getThemedContext()たがgetActivity().getBaseContext()、今では効果があります。

これは正しい方法ではない可能性があり、将来的に影響を与える可能性がありますが、今のところ、希望どおりに機能しています。

于 2014-03-14T10:44:44.953 に答える
0

私は通常、int 選択フィールドと setSelection(int) 関数を持つカスタム アダプターを使用します。getView 関数では、位置 == 選択に従ってビューの背景を設定します。

于 2014-03-14T09:20:14.697 に答える
0

この問題の解決策を探し、すべてを試しましたが、この解決策だけがうまくいきました。

このリンクで見つけることができますhttps://tuchangwei.github.io/2016/07/18/The-solution-that-the-menu-item-of-Navigation-View-can-t-change-its-background -選択時チェック/

https://tuchangwei.github.io/へのすべてのクレジット

于 2020-01-16T09:22:57.843 に答える