2014-01-04 2 views
5

Я реализовал ящик для навигации в своем приложении (http://developer.android.com/training/implementing-navigation/nav-drawer.html).Выбранный элемент в навигационном ящике

Как я могу изменить отображение фактически выбранного элемента? Я хочу, чтобы выделенный элемент был выделен жирным шрифтом и другим цветом.

В официальном примере они используют «setItemChecked», но как я могу изменить аспект одного элемента? Метод setOnItemSelectedListener не работает.

До сих пор, что я делаю это кусок кода, когда я открываю фрагмент:

for (int i = 0; i < mDrawerList.getChildCount(); i++){ 
    TextView t = (TextView) mDrawerList.getChildAt(i); 

    if(i == fragmentPosition) t.setTextColor(getResources().getColor(R.color.blue)); 
    else t.setTextColor(getResources().getColor(R.color.black)); 
} 

Он работает, но при запуске приложения, не выбран ни один пункт, и я не могу установить любой предмет, потому что listview еще не создан (он создается, когда мы открываем его в первый раз, я думаю).

Я попытался создать селектор, но не знаю, как правильно установить различные атрибуты (элемент отмечен, выбранный элемент, щелкнул элемент?), Искал документы, но я не понимаю.

Спасибо за любую помощь, которую вы можете предоставить!

ответ

1

Вот мое решение, чтобы изменить цвет и начертание шрифта выбранного элемента в панели навигации ...

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{ 
    setNavDrawerItemNormal(); 
    TextView txtview = ((TextView) view.findViewById(R.id.txtNav)); 
    txtview.setTypeface(null, Typeface.BOLD); 
    txtview.setTextColor(R.color.Red); 
} 

public void setNavDrawerItemNormal() 
{ 
    for (int i=0; i< mDrawerListView.getChildCount(); i++) 
    { 
     View v = mDrawerListView.getChildAt(i); 
     TextView txtview = ((TextView) v.findViewById(R.id.txtNav)); 
     Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Light.ttf"); 
     txtview.setTypeface(font); 
     txtview.setTextColor(R.color.Red); 
    } 
} 

И смела первого элемента в панели навигации при инициализации приложения, я сделал это в адаптере списка получить метод просмотра ...

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.navdrawer_item, parent, false); 
    TextView textView = (TextView) rowView.findViewById(R.id.txtNav); 
    textView.setText(values[position]); 
    if (position == 0) 
    { 
     textView.setTypeface(null, Typeface.BOLD); 
     textView.setTextColor(R.color.Red); 
    } 

    return rowView; 
} 

Итак, здесь я проверил, если положение элемента является 0 (то есть его первый элемент), а затем сделать его полужирным. Все это отлично работает для меня! ~

+0

Это грязная хак! Он вводит людей в заблуждение. Используйте 'CheckedTextView'instead! Также используйте 'myDrawerListView.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE)'. –

4

Я бы сделал это в адаптере.

mAdapter.setSelectedItem(position); 

public View getView(...) { 
    ... 
    if (position == mSelectedItem) { 
     text.setTypeface(...); 
     text.setBackgroundColor(...); 
    } else { 
     text.setTypeface(...); 
     text.setBackgroundColor(...); 
    } 
} 

И если вам не нужно, чтобы установить шрифт можно использовать селектор с

setTextColor(@drawable/my_selector). 

Или поместить его в файл XML с TextView

android:textColor="@drawable/my_selector" 
Смежные вопросы