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"
_を変更しようとしましたが、checked/selected/activatedには効果がありませんが、pressedには影響します。これはなぜだれか知っていますか?そして、どうすればそれを変更できますか?
なぜそれが機能しないのかまだわかりません。しかし、私が見つけた方法は、独自の_simple_list_item_activated
_レイアウトを使用してArrayAdapterに渡すことです。これは、テキストの色を白に設定する以外は基本的に同じでした。それからgetActionBar().getThemedContext()
をgetActivity().getBaseContext()
に置き換えましたが、今では効果があります。
これは正しい方法ではなく、将来的に影響を与える可能性がありますが、今のところは思い通りに機能しています。
この問題を解決するために:
1- ListViewの下にAndroid:listSelectorは必要ありません。
2 res/values)の下でstyles.xmlを開きます(または作成します)。
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="Android:activatedBackgroundIndicator">@drawable/drawer_list_selector</item>
</style>
3- res/drawable folder createdrawer_list_selector.xmlファイルの下
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:drawable="@drawable/light_gray_color" />
<item Android:state_activated="true" Android:drawable="@drawable/red_color" />
<item Android:drawable="@Android:color/transparent" />
</selector>
4- res/drawable createの下でred_color.xml/light_gray_color.xml (または他の名前)と希望の16進数の色を追加します。
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="#C8FF0000"/>
</shape>
5-プロジェクトを開きAndroidManifest.xml、Android:themeタグを追加します(存在しない場合)
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
参照/クレジット:---(ナビゲーションドロワーの選択したアイテムの色をデフォルトの青から変更する
「選択したアイテムのナビゲーションドロワーアイテムの背景色」を変更するには、属性を使用します。
colorControlHighlight
「styles.xml」では、次のようになります。
<style name="YourStyleNameFor.NavigationDrawer" parent="ThemeOverlay.AppCompat.Light">
<item name="colorControlHighlight">@color/your_highlight_color</item>
</style>
tagでStyleを適用することを忘れないでください:
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" />
ここに私がやった方法とそれが働いている、簡単な概念はadapterで選択された項目のpositionを維持し、notifyDataSetChanged
notifyDatasetChanged
の呼び出し時に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();
}
}
まだ困難に直面している人がいれば、遠慮なく聞いてください。
カスタムアダプタークラスで引き出しメニューを実装しました。それは誰かを助けるかもしれない引き出しリスト
<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);
これは私のために働いています:
最初にドロアブル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>
次に、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" />
<?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>
これは私のために働いた:ナビゲーションビューにリストではなく、メニュー項目を取り込むことでメニュードロワーを実装した。
このようなドロウアブルを作成しました:
<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:「アプリ」名前空間を定義する必要があります。
遅すぎることはわかっていますが、アプリでこの問題を解決しました。
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にカスタムセレクタードロウアブルを提供することに加えて、リストアイテムのバックグラウンドリソースを、状態ごとに異なるドロウアブルを持つ同様のセレクタードロウアブルに設定する必要があります。
通常、int選択フィールドとsetSelection(int)関数を持つカスタムアダプターを使用します。また、getView関数では、position == selectionに従ってビューの背景を設定します。
将来、誰かがここに来て、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の前にこのコードを追加します