web-dev-qa-db-ja.com

選択したアイテムのナビゲーション引き出しアイテムの背景色

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_に変更すると、色を変更できますが、これは正しい方法ではないと思います。テーマコンテキストを使用する必要があると思います。したがって、activatedBackgroundIndicatorgetActionBar.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"_を変更しようとしましたが、checked/selected/activatedには効果がありませんが、pressedには影響します。これはなぜだれか知っていますか?そして、どうすればそれを変更できますか?

40
RyanJohnstone

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

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

0
RyanJohnstone
52

選択したアイテムのナビゲーションドロワーアイテムの背景色」を変更するには、属性を使用します。

colorControlHighlight

styles.xml」では、次のようになります。

<style name="YourStyleNameFor.NavigationDrawer" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorControlHighlight">@color/your_highlight_color</item>
</style>

tagStyleを適用することを忘れないでください:

Android.support.design.widget.NavigationView

たとえば、activity_main.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"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/navigationdrawer_header"

    <!-- the following line referes to your style  -->
    app:theme="@style/YourThemeNameFor.NavigationDrawer"

    <!-- the following two lines are maybe also interesting for you -->
    app:itemIconTint="@color/gray3"
    app:itemTextColor="@color/gray3"

    app:menu="@menu/navigationdrawer_main" />
7
user3570407

ここに私がやった方法とそれが働いている、簡単な概念adapterで選択された項目のpositionを維持し、notifyDataSetChangednotifyDatasetChangedの呼び出し時にgetViewメソッドが再度呼び出され、ビューの取得で選択された位置の位置をチェックして背景ビューを変更します。コードは次のとおりです。

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();
    }
}

まだ困難に直面している人がいれば、遠慮なく聞いてください。

6
Syed Raza Mehdi

カスタムアダプタークラスで引き出しメニューを実装しました。それは誰かを助けるかもしれない引き出しリスト

<ListView
    Android:id="@+id/listview_drawer"
    Android:layout_width="260dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:background="@color/menu_item_color"
    Android:choiceMode="singleChoice"
    Android:divider="@Android:color/transparent"
    Android:dividerHeight="0dp"
    Android:fadingEdge="none"
    />

drawer_list_item.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" 
Android:background="@drawable/menu_selector"
>

<ImageView
    Android:id="@+id/imgIcon"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:layout_marginLeft="12dp"
    Android:layout_marginRight="12dp"
    Android:src="@drawable/ic_menu_home" />

<TextView
    Android:id="@+id/lblName"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_centerVertical="true"
    Android:gravity="center_vertical"
    Android:layout_toRightOf="@+id/imgIcon"
    Android:minHeight="48dp"
    Android:textColor="@color/menu_txt_color" />

menu_selector.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:exitFadeDuration="@Android:integer/config_mediumAnimTime">
<!-- selected -->
<item Android:drawable="@color/menu_item_active_color" Android:state_focused="true" Android:state_pressed="false"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_pressed="true"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_activated="true"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_checked="true"/>
<item Android:drawable="@color/menu_item_active_color" Android:state_selected="true"/>

<item Android:drawable="@color/menu_item_color" Android:state_activated="false"/>

これをリストビューのアイテムクリックリスナに追加しますyourlistview.setItemChecked(position、true);

5
Bhavin Chauhan

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

  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" />
    
5
Mithun Biswas
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item Android:drawable="@color/list_item_back_pressed" Android:state_pressed="true" />
    <item  Android:state_activated="true"><color Android:color="@color/primary_blue"/></item>
   <item Android:drawable="@color/list_item_back_normal"/>

</selector>
2
Query

これは私のために働いた:ナビゲーションビューにリストではなく、メニュー項目を取り込むことでメニュードロワーを実装した。

このようなドロウアブルを作成しました:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/drawer_menu_selector_color" Android:state_checked="true"></item>
<item Android:drawable="@color/drawer_menu_selector_color" Android:state_activated="true"></item>

onCreateメソッドで、選択したアクティビティに対応するメニュー項目のIDを設定します。このようにナビゲーションドロワーに描画可能なセレクタファイルを実装します

    app:itemBackground="@drawable/drawer_menu_selector"

fyi:「アプリ」名前空間を定義する必要があります。

0
antroid

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

Plsはばかげているとは思わず、単に「state_pressed」の位置をtopに変更するだけです。

<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"/>

ListSelectorにカスタムセレクタードロウアブルを提供することに加えて、リストアイテムのバックグラウンドリソースを、状態ごとに異なるドロウアブルを持つ同様のセレクタードロウアブルに設定する必要があります。

0
stan0

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

0
Ripityom

将来、誰かがここに来て、Navigation Drawer Activity(アクティビティプロンプトウィンドウでStudioによって提供される)を使用する場合

答えは-

MainActivityのOnCreate()の前にこれを使用します

    int[][] state = new int[][] {
            new int[] {Android.R.attr.state_checked}, // checked
            new int[] {-Android.R.attr.state_checked}
    };

    int[] color = new int[] {
            Color.rgb(255,46,84),
            (Color.BLACK)
    };

    ColorStateList csl = new ColorStateList(state, color);

    int[][] state2 = new int[][] {
            new int[] {Android.R.attr.state_checked}, // checked
            new int[] {-Android.R.attr.state_checked}
    };

    int[] color2 = new int[] {
            Color.rgb(255,46,84),
            (Color.GRAY)
    };

ColorStateList csl2 = new ColorStateList(state2, color2);

mainActivityのonNavigationItemSelected()でこれを使用します(Navigation Drawerアクティビティを使用する場合、この関数を記述する必要はありません。MainActivityに追加されます)。

 NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
    nav.setItemTextColor(csl);
    nav.setItemIconTintList(csl2);
    nav.setItemBackgroundResource(R.color.white);

ヒント-onNavigationItemSelected()のIf else Conditionの前にこのコードを追加します

0
Chirag Joshi