[英]How to Show Dialog Fragment from ImageView onClick in RecycleView Adapter
我有ActionBarDialog(DialogFragment),CarAdapter(RecycleView)和SportFragment。 我在SportFragment中創建方法(infoMethod)以顯示DialogFragment並正常工作。 但是如果我想在CarAdapter中調用該infoMethod不起作用(java.lang.NullPointerException)
SportFragment中的infoMethod
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調用infoMethod
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
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的解決方案嗎?
由於您嘗試在應用程序的兩個單獨區域中創建對話框,因此建議將其移到自己的類中
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());
替換您的調用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();
}
}
}
}
似乎
infoFrag.infoMethod(); //call infoMethod not work
確實不起作用,因為@SunnySydeUp可能是正確的。 也許嘗試在前面添加行號為
com.paijostudio.hitungmasa.fragment.SportFragment.infoMethod(SportFragment.java:210)上的java.lang.NullPointerException
非常具體。 您嘗試對null進行某些操作。 從這里發生的事情來看,很可能是SportFragment。
我的建議是為了調試而分解。 所以我會移動方法
public void infoMethod(){
在SportFragment之外。 並將其移至全班
CarAdapter
這意味着SportFragment可以為null。 然后檢查一下是否可行。 如果是這樣,這就是我的期望,則必須在創建SportFragment時解決該問題。 一旦解決,就可以移回該方法。 看看在Android文檔中獲取或創建Fragments。
https://developer.android.com/guide/components/fragments.html
更新:作為補充,並接收更多信息。 由於Fragment沒有附加活動,因此SportFragment創建不正確。
請看以下答案以正確地與您的片段進行通信如何在Fragment和適配器之間創建接口?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.