【问题标题】:Fragment Crashes when changing navigation更改导航时的片段崩溃
【发布时间】:2015-01-08 17:40:11
【问题描述】:

我有一个导航抽屉,其中有多个选项,例如展览、艺术家和画廊。当我在展览的内容视图中单击一个项目时,它会起作用。如果我在单个片段活动中预览项目后尝试导航到其他导航抽屉项目,例如艺术家或画廊,整个应用程序就会崩溃。有人可以帮忙吗??

代码..

private class LoadViewTask extends AsyncTask<Void, Integer, Void> {
    Activity mContex;
    GridView listView;

    public LoadViewTask(Activity mContext, GridView grid_view) {
        .......
    }

    @Override
    protected void onPreExecute() {
        ....
    }

    @Override
    protected Void doInBackground(Void... params) {
        ...........

    }

    @Override
    protected void onPostExecute(Void result) {
        progressDialog.dismiss();

        if(getActivity()!=null){
        loadListing();
        }

    }

    private void loadListing() {
        ChannelAppProductsArrayAdapter adapter = new ChannelAppProductsArrayAdapter(
                mContex, R.layout.itemlisting, productList, imageLoader);

        listView.setAdapter(adapter);

        //EDITED VERSION TO INITIATE SLIDER DRAWER
        mDrawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
        //prevent user from manually opening the drawer
        mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
        //Allow ScrollView at the preview-layout
        ScrollView SV= (ScrollView) getActivity().findViewById(R.id.scrollView_Preview_Layout);
        SV.scrollTo(0, 0);
        SV.fullScroll(ScrollView.FOCUS_UP);
        //END OF EDITED VERSION TO INITIATE SLIDER DRAWER

        //listView.setOnClickListener()


        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                /*String text = "Item click... should be implemented @ position: "
                        + position;
                Toast.makeText(mContex, text, Toast.LENGTH_LONG).show();*/
                Product product = productList.get(position);
                String productID = product.getId();


                String productDesc = product.getName();
                TextView ProductSummary;
                String productName=product.getDescription();
                TextView ProductName;
                ImageView productImage;
                imageLargename=productList.get(position).getLarge_image();

                //EDITED VERSION TO SHOW RIGHT DRAWER-18/11/2014
                mDrawerToggle = new CustomActionBarDrawerToggle(getActivity(), mDrawer);
                mDrawer.openDrawer(GravityCompat.END);
                mDrawer.setDrawerListener(mDrawerToggle);
                getActivity().getActionBar().setHomeButtonEnabled(true); // Prevents user from opening the drawer using the app icon

                Log.i("View onItemClick: ArtistProductDetailsFragment", "toggleRightDrawer()"+ productDesc);
                //END OF EDITED VERSION TO SHOW RIGHT DRAWER-18/11/2014

                //EDITED VERSION TO DISPLAY VIEW FOR SELECTED FRAGMENT ITEM-19/11/2014
                View RDrawerView = mDrawer.findViewById(R.id.preview_layout);

                //To set TextView of Product Name
                ProductSummary = (TextView) RDrawerView.findViewById(R.id.productsummary);
                ProductSummary.setText(productDesc);

                //To set TextView of product description
                ProductName= (TextView) RDrawerView.findViewById(R.id.productdesc);
                ProductName.setText(productName);

                //To get product Image from array
                productImage =(ImageView) RDrawerView.findViewById(R.id.productimage);
                String imgFilePath = url + imageLargename;
                imageLoader.displayImage(imgFilePath, productImage, options);


                productImage.setOnClickListener(new OnClickListener(){

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Toast.makeText(mContex,
                                "Pinch & Zoom To See Large Photo.",
                                Toast.LENGTH_SHORT).show();
                        String imgFilePath = url + imageLargename;
                        Intent intent = new Intent(
                                mContex.getApplicationContext(),
                                FullScreenViewActivity.class);
                        intent.putExtra("path", imgFilePath);
                        startActivity(intent);
                    }

                });
                //END OF EDITED VERSION TO DISPLAY VIEW FOR SELECTED FRAGMENT ITEM-19/11/2014

            }
        });

    }

    //EDITED VERSION FOR CUSTOMACTIONBARDRAWERTOGGLE
    private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

        public CustomActionBarDrawerToggle(Activity mActivity,
                DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.drawable.ic_drawer,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

        @Override
        public void onDrawerClosed(View view) {
            getActivity().getActionBar().setTitle(getActivity().getString(R.string.ns_menu_close));
            getActivity().invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            getActivity().getActionBar().setTitle(getActivity().getString(R.string.ns_menu_open));
            getActivity().invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    }
    //END OF EDITED VERSION FOR CUSTOMACTIONBARDRAWERTOGGLE

}

错误日志..

11-26 10:47:50.719: E/AndroidRuntime(19168): FATAL EXCEPTION: main
11-26 10:47:50.719: E/AndroidRuntime(19168): java.lang.NullPointerException
11-26 10:47:50.719: E/AndroidRuntime(19168):    at com.dapoaugury.channelappdemo.fragment.ChannelAppProductFragment$LoadViewTask$CustomActionBarDrawerToggle.onDrawerClosed(ChannelAppProductFragment.java:332)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.support.v4.widget.DrawerLayout.dispatchOnDrawerClosed(DrawerLayout.java:477)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:457)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1355)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.support.v4.widget.ViewDragHelper.setDragState(ViewDragHelper.java:866)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.support.v4.widget.ViewDragHelper$2.run(ViewDragHelper.java:335)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.os.Handler.handleCallback(Handler.java:725)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.os.Looper.loop(Looper.java:137)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at android.app.ActivityThread.main(ActivityThread.java:5039)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at java.lang.reflect.Method.invokeNative(Native Method)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at java.lang.reflect.Method.invoke(Method.java:511)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-26 10:47:50.719: E/AndroidRuntime(19168):    at dalvik.system.NativeStart.main(Native Method)

编辑 1:

我已经解决了我自己的问题。谢谢。

即完全删除private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle的整个方法。我已经意识到它不适用于第二个抽屉,因为它不会调用任何滑动抽屉功能的操作栏。

【问题讨论】:

  • 谁调用了loadListing()方法?
  • @Glenn 在 onPostExecute 方法中,我已经更新了代码
  • 只有两个在 onDrawerClosed 中被访问的对象可能正在生成 NPE:活动或其操作栏。首先找出哪个为空,然后尝试找出原因。如果是活动,那么活动可能在 AsyncTask 完成之前完成。或者,如果它是操作栏,请确保您已正确配置它(尽管您似乎必须这样做,因为在那之前您确实参考过它。
  • @Bruce 你怎么建议我弄清楚哪个实际上是空的?谢谢
  • 您可以在 onDrawerClosed 方法内的该行上放置断点并检查值。

标签: android android-fragments navigation-drawer


【解决方案1】:

即彻底删除私有类CustomActionBarDrawerToggle extends ActionBarDrawerToggle的整个方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    相关资源
    最近更新 更多