Variablenübergabe an Fragment klappt nicht

  • Antworten:9
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 213

03.02.2016, 12:08:06 via Website

Innerhalb der MainActivity zeige ich mein DialogFragment an:

dialogFragment.show(fm, "Sample Fragment");

Dieses Fragment enthält ein Textfeld, in dem ich einen String-Wert anzeigen möchte.

Ich versuche nach dem Anzeigen des Fragments den Wert dieses Feldes zu setzen:

dialogFragment.setFather("99");

Im Fragment selbst deklariere ich auf der obersten Ebene eine Variable für den zu übergebenden Wert und eine Variable, um den Bezug zu diesem Textfeld herzustellen:

   TextView textview;
   String mFather;

In OnCreateView wird dieser Bezug hergestellt:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.dialog_new, container, false);
        textview = (TextView) rootView.findViewById(R.id.textViewNewInfo);

Diese letzte Zeile lieferte übrigens "rot" im Editor, wenn ich sie ein paar Zeilen tiefer im Code schrieb. Logisch passiert aber in diesen Zeilen nichts Wichtiges. Ich glaube, das System ist noch nicht ausgereift.

Schließlich die kleine Funktion, die aufgerufen wird und die den Fehler liefert:

 public void setFather(String father)
    {
        textview.setText(mFather);

    }

Der Fehler lautet:

java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.widget.TextView.setText(java.lang.CharSequence)' on a null
object reference

Wobei mir nicht klar ist, ob die TextView oder die Variable mFather gemeint sind.

Was mache ich falsch?

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.174

03.02.2016, 12:12:08 via Website

Das darfst du auch nicht so machen, da nicht davon ausgehen kannst, dass die View schon existiert.
Entweder du prüfst auf NULL dann kommt zwar keine Exception aber auch kein gefülltes Textfeld oder du übergibstdie Daten vorher bwvor du ein show machst und setzt das ganze dann in der onCreateView auf das Textfeld.
So ähnlich hattte ich das ja in meinem beispiel auch.

— geändert am 03.02.2016, 12:12:18

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

03.02.2016, 12:25:57 via Website

Die kleine Methode habe ich noch etwas verändert:

public void setFather(String father)
    {
        mFather = father;
        textview.setText(mFather);
    }

Die Reihenfolge in der MainActivity sieht nun so aus:

dialogFragment.setFather("99");
dialogFragment.show(fm, "Sample Fragment");

Und ich habe wieder denselben Fehler :(.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.174

03.02.2016, 12:29:53 via Website

Ja weil du nich alles gemacht hastt was ich meinte:

public void setFather(String father)
{
mFather = father;//Nur Variable setzen

}

Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.dialog_new, container, false);
        textview = (TextView) rootView.findViewById(R.id.textViewNewInfo);
textview.setText(mFather);

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

03.02.2016, 12:43:21 via Website

OK, ich habe jetzt zwar keine Fehlermeldung mehr, was ich schon sehr schön finde :), sehe aber in meinem dargestellten Fragment nicht den ÜbergabeWert (der Testwert war "99").

Den müßte man zwischen dem Inputfeld (wo "Info" steht) und dem Button sehen.

image

— geändert am 03.02.2016, 12:43:54

Antworten
  • Forum-Beiträge: 213

03.02.2016, 12:45:26 via Website

Diese TextView, die den father anzeigen soll, hat übrigens den STandardtext "father".

Weiße Schriftfarbe auf weißem Hintergrund können wir auch ausschließen :).

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.174

03.02.2016, 12:49:57 via Website

Hmm komisch, mir fällt gerade ein dass ich immer von einem nromalen Fragment ausgegangen bitn.
Nomal im Sinne vor Anzeigen in einer Activity oder ViewPager.
Ob das bei einem Dialog fragment gleich geht weiss ich nicht aber sollte eigentlich schon..

Solle ja, hab gerade mal geschaut benutze selber ein Dialog Fragment das auch funktioniert.
Benutzt zwar einen Numberpicker für umblättern von Seiten aber egal.

Hier mal der Code:

 public static class PagePickerDialogFragment extends DialogFragment
        implements DialogInterface.OnClickListener {
    public static final String ARG_MAX_PAGES = "num_pages";
    public static final String ARG_SELECTED_PAGE = "start_page";
    private NumberPicker mNumberPicker;

    public static PagePickerDialogFragment newInstance(int paramInt1, int paramInt2) {
        PagePickerDialogFragment localPagePickerDialogFragment = new PagePickerDialogFragment();
        Bundle localBundle = new Bundle();
        localBundle.putInt("num_pages", paramInt1);
        localBundle.putInt("start_page", paramInt2);
        localPagePickerDialogFragment.setArguments(localBundle);
        return localPagePickerDialogFragment;
    }

    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
        if (paramInt == -1)
            ((MainActivity) getActivity()).onPagePicked(this.mNumberPicker.getValue());
    }

    public Dialog onCreateDialog(Bundle paramBundle) {
        this.mNumberPicker = new NumberPicker(getActivity());
        this.mNumberPicker.setMinValue(1);
        this.mNumberPicker.setMaxValue(getArguments().getInt("num_pages"));
        this.mNumberPicker.setValue(getArguments().getInt("start_page"));
        this.mNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
        return new AlertDialog.Builder(getActivity()).setTitle("Seite wählen").setView(this.mNumberPicker).setPositiveButton(17039370, this).setNegativeButton(17039360, null).create();
    }
}

— geändert am 03.02.2016, 12:50:21

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

03.02.2016, 12:54:49 via Website

Es geht:

image

Ich hatte aus Versehen in onCreateView noch Zusatzcode, der das Füllen mit der 99 überschrieben hat :).

Vielen Dank, Pascal. Damit kann ich erst mal weiterarbeiten.

Pascal P.

Antworten

Empfohlene Artikel