2015-08-15 76 views
0

我刚开始编程,我不太了解,所以我很抱歉,如果我问的是显而易见的。getArgument()。getInt()返回null

我正在制作一个图标包仪表板应用程序,我正在复制&将来自开源模板的代码粘贴到我的项目中。我知道这不是最好的事情,但我只是想了解复杂事情的工作原理。

我读过一些类似的问题,但我需要一步一步的指导。现在

,我面对这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String, int)' on a null object reference 
    at com.squaredlab.oblivion.app.Fragment.IconsFragment$IconAdapter.loadIcon(IconsFragment.java:117) 
    at com.squaredlab.oblivion.app.Fragment.IconsFragment$IconAdapter.<init>(IconsFragment.java:50) 
    at com.squaredlab.oblivion.app.Fragment.IconsFragment.onCreateView(IconsFragment.java:30) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5372) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

我不知道是什么问题。显然,我所看到的开源项目就像一种魅力。

这是代码:

public class IconsFragment extends Fragment { 

private String[] iconsnames; 
public IconAdapter icAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    icAdapter = new IconAdapter(); 
    View view = inflater.inflate(R.layout.icons_grid, container, false); 
    GridView gridview = (GridView) view.findViewById(R.id.icons_grid); 
    gridview.setColumnWidth(convertToPixel(72) + convertToPixel(4)); 
    gridview.setAdapter(icAdapter); 
    return view; 
} 

public static IconsFragment newInstance(int iconsArray) { 
    IconsFragment fragment = new IconsFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("iconsArrayId", iconsArray); 
    fragment.setArguments(args); 
    return fragment; 
} 

private class IconAdapter extends BaseAdapter { 
    private ArrayList<Integer> mThumbs; 

    public IconAdapter() { 
     loadIcon(); 
    } 

    @Override 
    public int getCount() { 
     return mThumbs.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mThumbs.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     IconsHolder holder; 
     Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_in); 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getActivity()); 
      convertView = inflater.inflate(R.layout.item_icon, parent, false); 
      holder = new IconsHolder(convertView); 
      convertView.setTag(holder); 
     } else { 
      holder = (IconsHolder) convertView.getTag(); 
     } 

     holder.icon.startAnimation(anim); 
     holder.icon.setImageResource(mThumbs.get(position)); 
     holder.content.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       View dialogIconView = View.inflate(getActivity(), R.layout.dialog_icon, null); 
       ImageView dialogIcon = (ImageView) dialogIconView.findViewById(R.id.dialogicon); 
       dialogIcon.setImageResource(mThumbs.get(position)); 
       String name = iconsnames[position].toLowerCase(Locale.getDefault()); 
       new MaterialDialog.Builder(getActivity()) 
         .customView(dialogIconView, false) 
         .title(convertText(name)) 
         .positiveText(R.string.close) 
         .show(); 
      } 
     }); 

     return convertView; 
    } 

    class IconsHolder { 

     final ImageView icon; 
     final MaterialRippleLayout content; 

     IconsHolder(View v) { 
      icon = (ImageView) v.findViewById(R.id.icon_img); 
      content = (MaterialRippleLayout) v.findViewById(R.id.icons_ripple); 
     } 
    } 

    private void loadIcon() { 
     mThumbs = new ArrayList<>(); 
     final Resources resources = getResources(); 
     final String packageName = getActivity().getApplication().getPackageName(); 
     addIcon(resources, packageName, getArguments().getInt("iconsArrayId", 0)); 
    } 

    private void addIcon(Resources resources, String packageName, int list) { 
     iconsnames = resources.getStringArray(list); 
     for (String extra : iconsnames) { 
      int res = resources.getIdentifier(extra, "drawable", packageName); 
      if (res != 0) { 
       final int thumbRes = resources.getIdentifier(extra, "drawable", packageName); 
       if (thumbRes != 0) 
        mThumbs.add(thumbRes); 
      } 
     } 
    } 

} 

private int convertToPixel(int dp) { 
    float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, 
      getActivity().getResources().getDisplayMetrics()); 
    return (int) px; 
} 

private String convertText(String name) { 
    String partialConvertedText = name.replaceAll("_", " "); 
    String[] text = partialConvertedText.split("\\s+"); 
    StringBuilder sb = new StringBuilder(); 
    if (text[0].length() > 0) { 
     sb.append(Character.toUpperCase(text[0].charAt(0))).append(text[0].subSequence(1, text[0].length()).toString().toLowerCase()); 
     for (int i = 1; i < text.length; i++) { 
      sb.append(" "); 
      sb.append(Character.toUpperCase(text[i].charAt(0))).append(text[i].subSequence(1, text[i].length()).toString().toLowerCase()); 
     } 
    } 
    return sb.toString(); 
} 

这是我实例化片段(开关3时)

public class SimpleHeaderDrawerActivity extends AppCompatActivity { 

//save our header or result 
private AccountHeader headerResult = null; 
private Drawer result = null; 

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

    // Handle Toolbar 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    // Create the AccountHeader 
    headerResult = new AccountHeaderBuilder() 
      .withActivity(this) 
      .withHeaderBackground(R.drawable.header) 
      .withSavedInstance(savedInstanceState) 
      .build(); 

    //Create the drawer 
    result = new DrawerBuilder() 
      .withActivity(this) 
      .withToolbar(toolbar) 
      .withAccountHeader(headerResult) //set the AccountHeader we created earlier for the header 
      .addDrawerItems(
        new PrimaryDrawerItem().withName(R.string.drawer_item_home).withIcon(FontAwesome.Icon.faw_home), 
        new PrimaryDrawerItem().withName(R.string.drawer_item_launchers).withIcon(FontAwesome.Icon.faw_star), 
        new PrimaryDrawerItem().withName(R.string.drawer_item_wallpapers).withIcon(FontAwesome.Icon.faw_image), 
        new PrimaryDrawerItem().withName(R.string.drawer_item_takealook).withIcon(FontAwesome.Icon.faw_search), 
        new PrimaryDrawerItem().withName(R.string.drawer_item_iconlist).withIcon(FontAwesome.Icon.faw_sort_alpha_asc), 
        new PrimaryDrawerItem().withName(R.string.drawer_item_requesticons).withIcon(FontAwesome.Icon.faw_edit), 
        new SectionDrawerItem().withName(R.string.drawer_item_section_header), 
        new SecondaryDrawerItem().withName(R.string.drawer_item_settings).withIcon(FontAwesome.Icon.faw_cog), 
        new SecondaryDrawerItem().withName(R.string.drawer_item_help).withIcon(FontAwesome.Icon.faw_question).setEnabled(false), 
        new SecondaryDrawerItem().withName(R.string.drawer_item_contact).withIcon(FontAwesome.Icon.faw_bullhorn) 
    ) // add the items we want to use with our Drawer 
      .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
       @Override 
       public boolean onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) { 
        if (drawerItem != null && drawerItem instanceof Nameable) { 
         getSupportActionBar().setTitle(((Nameable) drawerItem).getNameRes()); 
         //ignore the DemoFragment and it's layout it's just to showcase the handle with an keyboard 
         Fragment f = DemoFragment.newInstance(getResources().getString(((Nameable) drawerItem).getNameRes())); 

         switch (position) { 
          //case 0: 
          // f = new IconListFragment(); 
          // break; 
          //case 1: 
          // f = new IconListFragment(); 
          // break; 
          case 2: 
           f = new WallpapersFragment(); 
           break; 
          case 3: 
           f = new IconsFragment(); 
           break; 
          //case 4: 
          // f = new IconListFragment(); 
          // break; 
          //case 5: 
          // f = new IconListFragment(); 
          // break; 
          //case 6; 
          //startActivity(new Intent(this, RequestActivity.class)); 
          //break; 
         } 

         getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, f).commit(); 

        } 

        return false; 
       } 
      }) 
      .withOnDrawerListener(new Drawer.OnDrawerListener() { 
       @Override 
       public void onDrawerOpened(View drawerView) { 
       } 

       @Override 
       public void onDrawerClosed(View drawerView) { 
       } 

       @Override 
       public void onDrawerSlide(View drawerView, float slideOffset) { 
       } 
      }) 
      .withFireOnInitialOnClick(true) 
      .withSavedInstance(savedInstanceState) 
      .build(); 

    //react on the keyboard 
    result.keyboardSupportEnabled(this, true); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    //add the values which need to be saved from the drawer to the bundle 
    outState = result.saveInstanceState(outState); 
    super.onSaveInstanceState(outState); 
} 

@Override 
public void onBackPressed() { 
    //handle the back press :D close the drawer first and if the drawer is closed close the activity 
    if (result != null && result.isDrawerOpen()) { 
     result.closeDrawer(); 
    } else { 
     super.onBackPressed(); 
    } 
}  
+0

这是不相关的Javascript ...也似乎你的'getArguments()'方法调用返回null。 –

+0

您是否使用static _newInstance_方法创建了Fragment? – harism

+0

@harism是的,我做了: public static IconsFragment newInstance(int iconsArray){ ..... } –

回答

0

根本没有调用IconsFragment.newInstance()!

而不是

case 3: 
     f = new IconsFragment(); 
     break; 

做这个

case 3: 
     f = IconsFragment.newInstance(*provide int value here*); 
     break; 
+0

如果可以,我会给你一枚奖章。非常感谢! (我应该提供什么值?我很困惑) –

+0

它知道给我这个错误:android.content.res.Resources $ NotFoundException:字符串数组资源ID#0x1 at android.content.res.Resources.getStringArray( Resources.java:549) at com.mikepenz.materialdrawer.app.Fragment.IconsFragment $ IconAdapter.addIcon(IconsFragment.java:122)' –

+0

该值为iconsArrayId,必须将其放入newInstance()中的参数中。顺便说一下,什么是iconsArrayId? ISs是一个可拖动的?像“R.drawable.ic_project_icon”? – dhun