0

Я использую шаблон от AndroidHive: Material Design и решил добавить значок в каждую строку ящика навигации. Я уже модифицировал модель NavDrawerItem, getter и setter для значка.Android: Навигация Иконки ящиков

// Constructor 
public NavDrawerItem(boolean showNotify, String title, int icon) { 
    this.showNotify = showNotify; 
    this.title = title; 
    this.icon = icon; 
} 

public String getTitle() { 
    return title; 
} 

public int getIcon(){ 
    return icon; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public void setIcon(int icon){ 
    this.icon = icon; 
} 

Кроме того, его адаптер (NavigationDrawerAdapter) был изменен, добавив значок поддержки

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    NavDrawerItem current = data.get(position); 
    holder.title.setText(current.getTitle()); 
    holder.icon.setImageResource(current.getIcon()); 
} 

class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView title; 
    ImageView icon; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     title = (TextView) itemView.findViewById(R.id.title); 
     icon = (ImageView) itemView.findViewById(R.id.icon_drawer); 
    } 
} 

Я знаю, что этот ящик был добавлен в OnCreate метод FragmentDrawer.java

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // drawer labels 
    titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels); 
    icons = getActivity().getResources().getIntArray(R.array.nav_drawer_icon); 
} 

Это мой массив от string.xml

<string-array name="nav_drawer_labels"> 
    <item>@string/nav_item_home</item> 
    <item>@string/nav_item_data_visualization</item> 
    <item>@string/nav_item_pending_item</item> 
    <item>@string/nav_item_my_profile</item> 
    <item>@string/nav_item_about_us</item> 
</string-array> 

<string-array name="nav_drawer_icon"> 
    <item>@drawable/ic_home</item> 
    <item>@drawable/ic_data_visualization</item> 
    <item>@drawable/ic_pending_item</item> 
    <item>@drawable/ic_profile_drawer</item> 
    <item>@drawable/ic_about</item> 
</string-array> 

И мой ящик навигации пункт был заселен из ресурса, используя этот кусок кода в FragmentDrawer.java

public static List<NavDrawerItem> getData() { 
    List<NavDrawerItem> data = new ArrayList<>(); 

    // preparing navigation drawer items 
    for (int i = 0; i < titles.length; i++) { 
     NavDrawerItem navItem = new NavDrawerItem(); 
     navItem.setTitle(titles[i]); 
     System.out.println(titles[i]); 

     navItem.setIcon(icons[i]); 
     System.out.println(icons[i]); 

     data.add(navItem); 
    } 
    return data; 
} 

Моя проблема заполнения значок из ресурса, в коде выше System.out.println (иконки [я ]); всегда дайте мне 0 значение. Я думаю, именно поэтому я не могу установить imageResource на значок моего навигационного ящика.

Любая помощь будет оценена по достоинству. Спасибо.

+0

вы можете использовать поддержку поддержки Android для создания NavigationDrawer легко ... перейдите по этой ссылке http://android-developers.blogspot.in/2015/05/android-design-support-library.html – Harish

+0

попробуйте getDrawable (значки [i]) – Harish

+0

Ваша ссылка была потрясающая, Харриш. Но это должно изменить весь проект. Думаю, я сначала займусь решением этой проблемы. Где я должен использовать getDrawable, Хариш? –

ответ

1

Проблема в строке:

icons = getActivity().getResources().getIntArray(R.array.nav_drawer_icon); 

Для чтения ресурсов идентификаторы из массива вы можете использовать этот код:

icons = new int[titles.length]; 
TypedArray iconsArray = getResources().obtainTypedArray(R.array.nav_drawer_icon); 
for (int i = 0; i < icons.length; i++) 
    icons[i] = iconsArray.getResourceId(i, -1); 

iconsArray.recycle(); 

Но, наверное, самое лучшее действие будет использовать NavigationView.

+0

Спасибо, Камиль. Ты спас мой день! –

Смежные вопросы