2016-04-18 15 views
0

Ich versuche, eine DialogFragment über einen Adapter zu öffnen, ich habe die ganze Dokumentation und andere Fragen, ich kann das Problem nicht finden. Dies ist die vollständige Fehlerzeile aus dem Protokoll java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentManager android.app.Activity.getFragmentManager()' on a null object reference Android: zeigt dialogFrag auf Adapter gibt NullPointerException

Mein Adapter:

public class SubjectsAdapter extends RecyclerView.Adapter<SubjectsAdapter.ViewHolder> { 

    public List<String> items = new ArrayList<>(); 
    public Activity mcontext; 

    public SubjectsAdapter(Activity context) { 
     this.mcontext=context.getParent(); 
     assert mcontext != null; 

    } 

//...usual adapter code here... 

    static int i; 

    class ViewHolder extends RecyclerView.ViewHolder{ 

     public Button GridButton; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      GridButton = (Button) itemView.findViewById(R.id.grid_button); 

      GridButton.setId(++i); 
      GridButton.setText("Button " + i); 

      assert GridButton != null; 
      GridButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //removeItem(getAdapterPosition()); 
        Fragment_Subject_Edit newFragment = Fragment_Subject_Edit.newInstance(); 
        newFragment.show(mcontext.getFragmentManager(), "Title"); 
       } 
      }); 
     } 
    }  
} 

die DialogFragment:

 public static Fragment_Subject_Edit newInstance() { 

     return new Fragment_Subject_Edit(); 
    } 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     // Pass null as the parent view because its going in the dialog layout 
     builder.setView(inflater.inflate(R.layout.fragment_subject_edit, null)); 

     return builder.create(); 
    } 

Ok, so was bin ich hier fehlt meine DialogFragment zu zeigen, wenn Ich klicke in den GridButton?

+1

Was passiert, wenn Sie nur 'mcontext = context;' zuweisen? Aus irgendeinem Grund, den Sie gerade verwenden 'mcontext = context.getParent();'? –

+0

Okay, es hat funktioniert, vielen Dank! –

Antwort

1

An dieser Linie:

newFragment.show(mcontext.getFragmentManager(), "Title"); 

Sie fordern die fragmentManager und Ihr Problem zu mcontext ist, dass an diesem Punkt mcontext null ist. Wie George sagte, wenn du es nicht wirklich brauchst, setze einfach den Kontext geradeaus und nicht den Elternteil, was eine mögliche Ursache für den Nullpunkt ist.

+0

Ok, das hat funktioniert, aber schnelle Frage, wenn ich '.getParent' nicht festlege, in welchem ​​Kontext komme ich auf' mcontext'exactly? –

+0

Nun, das hängt davon ab, welchen Parameter Sie bei der Konstruktion an das Objekt "SubscribersAdapter" übergeben. Meine Vermutung ist, dass Sie es aus Ihrer Hauptaktivität erstellen und "this" als Parameter übergeben. Wenn dies der Fall ist, erhalten Sie Ihren Aktivitätskontext. –

+0

Ja hast du richtig geraten, danke für die Erklärung =) –

0

versuchen Sie, nach dem Einschließen der Pop-Bibliothek in Ihre grdle Abhängigkeiten folgenden Code zu verwenden. Sie werden nicht müssen sogar Methode mit diesem Sie mehr Code nicht brauchen

public class SubjectsAdapter extends RecyclerView.Adapter<SubjectsAdapter.ViewHolder> { 

    public List<String> items = new ArrayList<>(); 
    public Activity mcontext; 

    public SubjectsAdapter(Activity context) { 
     this.mcontext=context.getParent(); 
     assert mcontext != null; 

    } 

//...usual adapter code here... 

    static int i; 

    class ViewHolder extends RecyclerView.ViewHolder{ 

     public Button GridButton; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      GridButton = (Button) itemView.findViewById(R.id.grid_button); 

      GridButton.setId(++i); 
      GridButton.setText("Button " + i); 

      assert GridButton != null; 
      GridButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Pop.on(mcontext).with().title("Title").body(R.layout.fragment_subject_edit).show(); 
       } 
      }); 
     } 
    }  
} 

als wie einfach onCreateDialog

fügen Sie diese in Ihrer App-Modul gradle

dependencies { 
    compile 'com.vistrav:pop:2.0' 
} 

und Ihre Klasse implementieren um danach einen Dialog aufzubauen. Sie können mehr Details dieser Bibliothek überprüfen here

+0

Es ist gelöst, aber danke –

Verwandte Themen