2016-09-29 61 views
0

我有ActionBarDialog(DialogFragment),CarAdapter(RecycleView)和SportFragment。我在SportFragment中创建方法(infoMethod)以显示DialogFragment并正常工作。但是,如果我想调用infoMethod在CarAdapter是不行的(显示java.lang.NullPointerException)如何显示对话框片段从ImageView onClick在回收视图适配器

infoMethod在SportFragment

public void infoMethod(){ 
    Bundle args = new Bundle(); 
    args.putString("title", "Dialog with Action Bar"); 
    ActionBarDialog actionbarDialog = new ActionBarDialog(); 
    actionbarDialog.setArguments(args); 
    actionbarDialog.show(getActivity().getSupportFragmentManager(), 
      "action_bar_frag"); 
} 

我尝试从CarAdapter

 public MyViewHolder(View view) { 
     super(view); 

     image= (ImageView) view.findViewById(R.id.imageViewlist); 
     image.setOnClickListener(this); 

    } 
    @Override 
    public void onClick(View v) { 
     SportFragment infoFrag = new SportFragment(); 
     if (v.getId() == image.getId()){ 
      v.startAnimation(AnimationUtils.loadAnimation(v.getContext(), R.anim.imagelist)); 
      infoFrag.infoMethod(); //call infoMethod not work 

      Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     } 
    } 

logcat的

调用infoMethod
09-29 13:30:09.292 18661-18661/com.paijostudio.hitungmasa E/AndroidRuntime: FATAL EXCEPTION: main 
                      java.lang.NullPointerException 
                       at com.paijostudio.hitungmasa.fragment.SportFragment.infoMethod(SportFragment.java:210) 
                       at com.paijostudio.hitungmasa.adapter.CarAdapter$MyViewHolder.onClick(CarAdapter.java:73) 
                       at android.view.View.performClick(View.java:4204) 
                       at android.view.View$PerformClick.run(View.java:17355) 
                       at android.os.Handler.handleCallback(Handler.java:725) 
                       at android.os.Handler.dispatchMessage(Handler.java:92) 
                       at android.os.Looper.loop(Looper.java:137) 
                       at android.app.ActivityThread.main(ActivityThread.java:5041) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:511) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
                       at dalvik.system.NativeStart.main(Native Method) 

任何解决方案显示DialogFragment?谢谢

+0

在这里显示您的日志...这将有助于你。 –

+0

我只是猜测在这里,但我认为你正在调用'infoMethod',它期望附加一个活动。但在那个时候,这项活动还没有完成。除非将其添加到片段管理器,否则它不会执行整个片段生命周期。 “infoMethod”必须存在于SportFragment中是否有原因? – SunnySydeUp

+0

@Kuldeep Kulkarni log cat add –

回答

0

似乎

infoFrag.infoMethod(); //call infoMethod not work 

确实不工作,因为@SunnySydeUp可能是正确的。也许尝试为

显示java.lang.NullPointerException 在com.paijostudio.hitungmasa.fragment.SportFragment.infoMethod在前面加了行号(SportFragment.java:210)

是非常具体的关于它。你试图对一些空的东西做些什么。从这里发生的事情看,这很可能是SportFragment。

我的建议是为了调试而分解。所以我会移动方法

public void infoMethod(){ 

SportFragment之外。并将其移动到类

CarAdapter 

这意味着SportFragment可以为null。只要检查一下是否有效。如果是这样,那就是我所期望的,你必须在创建SportFragment时解决这个问题。一旦解决了问题,您可以将方法移回原处。寻找获取,或在Android文档中创建Fragments。

https://developer.android.com/guide/components/fragments.html

UPDATE: 作为补充和接收的详细信息。由于SportFragment创建不正确,碎片没有附加任何活动。

看一看下面的答案正确传达给你的片段 How to create interface between Fragment and adapter?

+0

我试图在CarAdapter中移动infoMethod,但我没有在这一行中找到解决方案actionbarDialog.show(getActivity()。getSupportFragmentManager(), –

+0

现在很明显getActivity()。getSupportFragmentManager()为null,因为您创建一个SportFragment没有附加任何活动 – QVDev

+0

更新的答案,需要一个更好的适配器到碎片通信的结构。确保你的碎片被附加到一个活动,或者你也可以从一个活动创建对话框 – QVDev

1

既然你想在应用中创建两个独立的区域对话,我建议把它出它自己的类

public class DialogHelper { 
    public static void infoMethod(FragmentManager fragmentManager) { 
     Bundle args = new Bundle(); 
     args.putString("title", "Dialog with Action Bar"); 
     ActionBarDialog actionbarDialog = new ActionBarDialog(); 
     actionbarDialog.setArguments(args); 
     actionbarDialog.show(fragmentManager, "action_bar_frag"); 
    } 
} 

然后在SportFragment更换DialogHelper.infoMethod(getActivity().getSupportFragmentManager());

至于你的电话你CarAdapter,你需要参加一个FragmentManager

recyclerView.setAdapter(new CarAdapter(getActivity().getSupportFragmentManager())) 

... 

public class CarAdapter extends RecyclerView.Adapter<MyViewHolder> { 
    private FragmentManager fragmentManager; 

    public CarAdapter(FragmentManager fragmentManager) { 
     this.fragmentManager = fragmentManager; 
    } 

    public class MyViewHolder { 
     ... 

     @Override 
     public void onClick(View v) { 
      if (v.getId() == image.getId()){ 
       v.startAnimation(AnimationUtils.loadAnimation(v.getContext(), R.anim.imagelist)); 
       DialogHelper.infoMethod(fragmentManager); 

       Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 
+0

谢谢,不是工作,但我我在SportFragment中再次修改,然后是CarAdapter,这是工作,投票有用。 –

相关问题