找不到资源导航抽屉项目中的异常

时间:2016-01-11 08:02:49

标签: android navigation-drawer onclicklistener android-navigation-drawer

错误StackTrace:

01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime: FATAL EXCEPTION: main
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime: Process: info.androidhive.materialdesign, PID: 13251
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign **E/AndroidRuntime: android.content.res.Resources$NotFoundException:** Resource ID #0x0
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.content.res.Resources.getValue(Resources.java:1343)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.content.res.Resources.getDrawable(Resources.java:819)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.content.res.Resources.getDrawable(Resources.java:799)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.content.Context.getDrawable(Context.java:403)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:26)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:321)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:177)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:170)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:53)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:74)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at com.actapps.ActinumERP.adapter.NavigationDrawerAdapter.onBindViewHolder(**NavigationDrawerAdapter.java:47**)
01-11 13:04:47.305 13251-13251/info.androidhive.materialdesign E/AndroidRuntime:     at com.actapps.ActinumERP.adapter.NavigationDrawerAdapter.onBindViewHolder(**NavigationDrawerAdapter.java:20)**

string.xml

 <string-array name="nav_drawer_labels">
    <item>@string/nav_item_home</item>
    <item>@string/nav_item_friends</item>
    <item>@string/nav_item_notifications</item>
  </string-array>
<array name="img_id_arr">
    <item>@drawable/ic_store</item>
    <item>@drawable/ic_business</item>
    <item>@drawable/ic_power</item>
</array>

创建了2个arrayws,1个字符串数组,2个数组,其中包含图像ID

FragmentDrawer.java
public class FragmentDrawer extends Fragment {

private static String TAG = FragmentDrawer.class.getSimpleName();

private RecyclerView recyclerView;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private NavigationDrawerAdapter adapter;
private View containerView;
private static String[] titles = null;
private static int[] images=null;
private FragmentDrawerListener drawerListener;

public FragmentDrawer() {

}

public void setDrawerListener(FragmentDrawerListener listener) {
    this.drawerListener = listener;
}

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]);
        navItem.setIcon(images[i]);
        data.add(navItem);
    }
    return data;
}

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

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflating view layout
View layout = inflater.inflate(R.layout.fragment_navigation_drawer,                       container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);

    adapter = new NavigationDrawerAdapter(getActivity(), getData());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.addOnItemTouchListener(new                        RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            drawerListener.onDrawerItemSelected(view, position);
            mDrawerLayout.closeDrawer(containerView);
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

    return layout;
}
Here,created string,int to iterate the arrays.

NavigationDrawerAdapter.java
**public class NavigationDrawerAdapter extends       RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder>** {
List<NavDrawerItem> data = Collections.emptyList();
private LayoutInflater inflater;
private Context context;

public NavigationDrawerAdapter(Context context, List<NavDrawerItem> data) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = data;
}

public void delete(int position) {
    data.remove(position);
    notifyItemRemoved(position);
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.nav_drawer_row, parent, false);
    MyViewHolder holder = new MyViewHolder(view);
    return holder;
}

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

@Override
public int getItemCount() {
    return data.size();
}

class MyViewHolder extends RecyclerView.ViewHolder {
    TextView title;
   ImageView image;
    public MyViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.title);
        image=(ImageView)itemView.findViewById(R.id.image1);
    }
}
}

在这里,这是持有物品的视图持有人..

NavDrawerItem.java

    public class NavDrawerItem {
    private boolean showNotify;
    private String title;
    private int icon;

    public NavDrawerItem() {

    }

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

    public boolean isShowNotify() {
        return showNotify;
    }

    public void setShowNotify(boolean showNotify) {
        this.showNotify = showNotify;
    }

    public String getTitle() {
        return title;
    }

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

    public int getIcon() {
        return icon;
    }

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

代码中的粗体文字也显示错误..请帮助任何人..     感谢您提前获得帮助......

2 个答案:

答案 0 :(得分:0)

替换NavigationDrawerAdapter的bindview持有者

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
NavDrawerItem current = data.get(position);
holder.title.setText(String.valueOf(current.getTitle()));

}

答案 1 :(得分:0)

下面:

 images=getActivity().getResources().getIntArray(R.array.img_id_arr);

img_id_arr数组包含drawables id,因此请使用obtainTypedArray代替getIntArray获取TypedArray数组,然后使用getDrawable方法获取Drawable

TypedArray images;
images=getActivity().getResources().obtainTypedArray(R.array.img_id_arr);

现在使用getResourceId获取资源ID:

navItem.setIcon(images.getResourceId(i,-1));