Java 更改导航抽屉中所选项目的背景颜色

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23396434/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 22:49:05  来源:igfitidea点击:

Change background color of selected item in navigation drawer

javaandroidandroid-layoutnavigation-drawer

提问by End.Game

I want change the blue color of selected item in the navigation drawer.. I can change it when you tap over an item but not in the active item. This is what I use: in the drawable folder

我想更改导航抽屉中所选项目的蓝色。我可以在您点击某个项目而不是活动项目时更改它。这是我使用的:在 drawable 文件夹中

<selector xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:state_activated="true" android:drawable="@color/default_color" />
    <item android:state_selected="true" android:drawable="@color/uva_color" />
    <item android:state_pressed="true" android:drawable="@color/uva_color" />
    <item android:state_focused="true" android:drawable="@color/default_color" />
    <item android:drawable="@color/default_color" />  
</selector>

The color.xml

颜色.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="uva_color">#f2f8ee</color>
    <color name="default_color">#f2f8ee</color>
</resources>

And then in the layout of nav drawer:

然后在导航抽屉的布局中:

<ListView
        android:id="@+id/left_drawer"
        android:layout_width="260dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:fitsSystemWindows="true"
        android:clipToPadding="false"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:listSelector="@drawable/activated_background"
        android:background="#ffff"/>

So, the current item selected not change color..any ideas?

所以,当前选择的项目不会改变颜色..有什么想法吗?

EDIT with java nav drawer:

使用 java 导航抽屉编辑:

public class MainActivity extends Activity {

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

private CharSequence mDrawerTitle;
private CharSequence mTitle;
CustomDrawerAdapter adapter;

List<DrawerItem> dataList;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/** Customizzo la actionbar */
ActionBar actionBar = getActionBar();
actionBar.setCustomView(R.layout.actionbarcustom);
        //actionBar.setDisplayShowTitleEnabled(false);
        //actionBar.setDisplayShowCustomEnabled(true);
setTitle("FTV");
int actionBarTitleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
if (actionBarTitleId > 0) {
    TextView title = (TextView) findViewById(actionBarTitleId);
    if (title != null) {
        title.setTextColor(Color.WHITE);
    }
}

/**
* Controllo la versione di android, se Kitkat o superiore rendo la nav bar trasparente
* */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow(); // in Activity's onCreate() for instance

        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

SystemBarTintManager systemBarTintManager = new SystemBarTintManager(this);
systemBarTintManager.setStatusBarTintEnabled(true);
systemBarTintManager.setStatusBarTintColor(Color.parseColor("#ff3600"));

/*systemBarTintManager.setNavigationBarTintEnabled(true);
systemBarTintManager.setNavigationBarTintColor(Color.parseColor("#CC0000"));*/

    }

// Initializing
dataList = new ArrayList<DrawerItem>();
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);


mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);

// Add Drawer Item to dataList
dataList.add(new DrawerItem(true)); // adding a spinner to the list

dataList.add(new DrawerItem("Preferiti")); // adding a header to the list
dataList.add(new DrawerItem("Avvisi", R.drawable.avvisi));
dataList.add(new DrawerItem("Pianifica viaggio", R.drawable.bus));
dataList.add(new DrawerItem("Mappe e Tratte", R.drawable.maps));
//dataList.add(new DrawerItem("Lables", R.drawable.ic_action_labels));

dataList.add(new DrawerItem("Impostazioni"));// adding a header to the list
dataList.add(new DrawerItem("Settings", R.drawable.settings));
/*dataList.add(new DrawerItem("Cloud", R.drawable.ic_action_cloud));
dataList.add(new DrawerItem("Camara", R.drawable.ic_action_camera));
dataList.add(new DrawerItem("Video", R.drawable.ic_action_video));
dataList.add(new DrawerItem("Groups", R.drawable.ic_action_group));
dataList.add(new DrawerItem("Import & Export",
R.drawable.ic_action_import_export));*/

dataList.add(new DrawerItem("Altro")); // adding a header to the list
dataList.add(new DrawerItem("About", R.drawable.about));
//dataList.add(new DrawerItem("Settings", R.drawable.ic_action_settings));
dataList.add(new DrawerItem("Help", R.drawable.help));

adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
dataList);

mDrawerList.setAdapter(adapter);

mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}

public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
};

mDrawerLayout.setDrawerListener(mDrawerToggle);

if (savedInstanceState == null) {

if (dataList.get(0).isSpinner()
& dataList.get(1).getTitle() != null) {
SelectItem(2);
} else if (dataList.get(0).getTitle() != null) {
SelectItem(1);
} else {
SelectItem(0);
}
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

public void SelectItem(int possition) {

Fragment fragment = null;
Bundle args = new Bundle();
switch (possition) {


case 2:
fragment = new FragmentThree();
args.putString(FragmentThree.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList
.get(possition).getImgResID());

break;
case 3:
fragment = new FragmentOne();
args.putString(FragmentOne.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 4:
fragment = new FragmentTwo();
args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 5:
fragment = new FragmentThree();
args.putString(FragmentThree.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList
.get(possition).getImgResID());
break;
case 6:
fragment = new FragmentTwo();
args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 7:
fragment = new FragmentThree();
args.putString(FragmentThree.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList
.get(possition).getImgResID());
break;
case 8:
fragment = new FragmentOne();
args.putString(FragmentOne.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 9:
fragment = new FragmentTwo();
args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 10:
fragment = new FragmentThree();
args.putString(FragmentThree.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList
.get(possition).getImgResID());
break;
case 11:
fragment = new FragmentOne();
args.putString(FragmentOne.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 12:
fragment = new FragmentThree();
args.putString(FragmentThree.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;  
case 13:
fragment = new FragmentOne();
args.putString(FragmentOne.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 14:
fragment = new FragmentTwo();
args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
default:
break;
}

fragment.setArguments(args);
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.content_frame, fragment)
.commit();

mDrawerList.setItemChecked(possition, true);
//mDrawerList.getChildAt(possition).setBackgroundResource(R.drawable.activated_background);
setTitle(dataList.get(possition).getItemName());
mDrawerLayout.closeDrawer(mDrawerList);

}

@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}

return false;
}

private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
if (dataList.get(position).getTitle() == null) {
SelectItem(position);
}

}
}

}

This is the standard color in activated item that I DON'T WANT!

这是我不想要的激活项目的标准颜色!

enter image description here

在此处输入图片说明

I want this: #f2f8ee

我想要这个:#f2f8ee

回答by rperryng

Looks fine...

看起来不错...

in your java code that hosts the listview, call myListView.setItemChecked(position, true);

在托管列表视图的 Java 代码中,调用 myListView.setItemChecked(position, true);

Also, the color you set for state_activatedis the same as when the drawer is in its normalstate. Is this intended?...

此外,您设置的颜色state_activated与抽屉处于其normal状态时的颜色相同。这是故意的吗?...

Create an xml file with a TextView

使用 TextView 创建一个 xml 文件

nav_drawer_item.xml

nav_drawer_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android">
    android:id="@+id/textId"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/[your_selector]" />

in getview()for your adapter

getview()您的适配器

@Override
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView view = (TextView) LayoutInflater.from(getContext()).inflate(R.layout.nav_drawer_item);
    view.setText("whatever_text");
    return view;
}

回答by Sishin

check this sample custom navigation drawer

检查此示例自定义导航抽屉

inside onclick

里面点击

  SelectItem.get(position).setColor(getResources().getColor("your color")); 

回答by Syed Raza Mehdi

here is how i have done and it is working, the brief conceptis maintain the positionof selected item in adapterand call notifyDataSetChangedon calling notifyDatasetChangedthe getViewmethod is called again and in get view check the position on the selected position change the background view. For details see thisanswer.

这是我所做的并且它正在工作,简单的概念是在适配器中保持所选项目的位置,并再次调用调用该方法的方法,并在获取视图中检查所选位置上的位置更改背景视图。有关详细信息,请参阅答案。notifyDataSetChangednotifyDatasetChangedgetView

If you have any confusion please feel free to ask.

如果您有任何困惑,请随时提问。