2016-09-29 4 views
0

Ich habe ActionBarDialog (DialogFragment), AutoAdapter (RecycleView) und SportFragment. Ich bin create Methode (infoMethod) in SportFragment um DialogFragment zu zeigen und gut zu funktionieren. Aber wenn ich anrufen will, dass infoMethod in CarAdapter nicht (java.lang.NullPointerException)So zeigen Sie Dialog Fragment von ImageView onClick in RecycleView Adapter

infoMethod in 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"); 
} 

ich versuchen infoMethod anrufen aus 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

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) 

Jede Lösung zum Anzeigen von DialogFragment? Danke

+0

Zeigen Sie Ihr Protokoll hier ... das wird für Sie hilfreich sein. –

+0

Ich rate nur hier, aber ich denke, dass Sie die 'infoMethod' aufrufen, die eine Aktivität erwartet. Aber zu diesem Zeitpunkt wurde die Aktivität noch nicht angefügt. Und es wird nicht, wenn Sie es dem Fragmentmanager hinzufügen und es den gesamten Fragmentlebenszyklus durchläuft. Gibt es einen Grund, warum die 'infoMethod' im SportFragment leben muss? – SunnySydeUp

+0

@Kuldeep Kulkarni Log-Katze hinzufügen –

Antwort

0

Scheinen

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

ist in der Tat nicht funktioniert, wie @SunnySydeUp könnte Recht haben. Vielleicht versuchen Sie die Zeilennummern vor als

java.lang.NullPointerException bei com.paijostudio.hitungmasa.fragment.SportFragment.infoMethod (SportFragment.java:210)

ist ziemlich spezifisch hinzufügen darüber. Sie versuchen etwas auf etwas zu tun, das null ist. Und von dem, was hier passiert, ist wahrscheinlich das SportFragment.

Mein Vorschlag ist es, Dinge für Fehlersuche zu brechen. So würde ich die Methode

public void infoMethod(){ 

außerhalb der SportFragment verschieben. Und verschieben Sie es in die Klasse

CarAdapter 

Bedeutung SportFragment kann Null sein. Und überprüfen Sie, ob das funktioniert. Wenn ja, und das ist, was ich erwarte, müssen Sie das Problem beheben, indem Sie das SportFragment erstellen. Und sobald das behoben ist, können Sie die Methode zurückbewegen. Sehen Sie nach, oder erstellen Sie Fragmente in den Android-Dokumenten.

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

UPDATE: Als Ergänzung und weitere Informationen erhalten. Da das Fragment keine Aktivität hat, da das SportFragment falsch erstellt wird.

Haben Sie einen Blick auf die folgende Antwort richtig auf Ihr Fragment zu kommunizieren How to create interface between Fragment and adapter?

+0

Ich habe versucht, infoMethod in CarAdapter zu verschieben, aber ich fand keine Lösung in dieser Zeile actionbarDialog.show (getActivity(). GetSupportFragmentManager(), –

+0

Nun ist es offensichtlich, dass getActivity(). GetSupportFragmentManager() ist Null beim Erstellen eines SportFragment ohne diese an irgendeine Aktivität anzufügen – QVDev

+0

Aktualisierte Antwort, eine bessere Struktur für den Adapter, um die Kommunikation zu fragmentieren, ist erforderlich Stellen Sie sicher, dass Fragment an eine Aktivität angehängt ist, oder Sie können den Dialog auch aus einer Aktivität erstellen – QVDev

1

Da Sie versuchen, den Dialog in zwei getrennten Bereichen der App zu erstellen, schlage ich vor, es aus zu seiner eigenen Klasse zu bewegen

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"); 
    } 
} 

Dann in SportFragment ersetzen Ihren Anruf mit DialogHelper.infoMethod(getActivity().getSupportFragmentManager());

Was Ihre CarAdapter, werden Sie in einenehmen müssen.

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

Danke, nicht funktionieren, aber ich Bin in SportFragment dann wieder modifiziert und dann CarAdapter und das funktioniert. Vote nützlich. –

Verwandte Themen