Zugriff auf eine TextView mit findViewById klappt nicht

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

02.02.2016, 19:39:02 via Website

Hier möchte ich mich auf ein Textfeld in meinem DialogFragment beziehen.

TextView textViewNewInfo;
textViewNewInfo = (TextView) dialogFragment.findViewById(R.id.textViewNewInfo);

Jedoch bleibt findViewById rot mit dem Hinweis, dass diese Methode nicht resolved werden kann. Was mache ich falsch?

— geändert am 02.02.2016, 19:39:27

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

02.02.2016, 20:41:59 via Website

Dein DialogFragment ist von welchem Typ vom Typ Fragment nehme ich an.
FindView by ID geht standardmäßig nur bei Views etc.

Wenn das Fragment sichbar ist kannst du Fragment#getView() benutzen:
http://developer.android.com/reference/android/app/Fragment.html#getView%28%29

— geändert am 02.02.2016, 20:42:18

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

Frank Rudolf

Antworten
  • Forum-Beiträge: 58

02.02.2016, 20:50:42 via Website

Dein View sollte so aussehen, wenn es sich in einer Fragment Klasse befindet:

    View view1 = inflater.inflate(R.layout.dein_layout, null);
    TextView tv1 = view1.findViewById(R.id.dein_textview);

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

02.02.2016, 21:02:36 via Website

Ich danke Euch.

Das waren gute Hinweise.

Ich habe einfach große Probleme damit, Werte von der MainActivity zum DialogFragment zu senden. Aber wenn es nicht läuft, melde ich mich noch mal.

Ich setze diesen Thread erst mal auf bearbeitet.

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

02.02.2016, 21:21:59 via App

Was ist daran das Problem?
Uberfib einfsch die Werte daten die du brauchst als Parameter ist Bundle o.ä. dann brauchst du keine. Verweis auf die Activity etc.

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

Antworten
  • Forum-Beiträge: 213

02.02.2016, 21:29:13 via Website

Mein Übergabewert verwandelt sich in Null.

Mit dieser Zeile von der ActivityMain gehts los:

DialogFragment_New dialogFragment = DialogFragment_New.newInstance(father, "dskf");

Für das zweite Argument habe ich nur Blödsinn übergeben. Den Parameter kann ich ja später löschen.

Fortsetzung folgt.

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

02.02.2016, 21:33:36 via Website

Warum nicht so?

DialogFragment_New dialogFragment =  new DialogFragment_New(father, "dskf");

und dann als Konstruktor und in Klassenvariablen speichern

— geändert am 02.02.2016, 21:33:43

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

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

02.02.2016, 21:53:24 via Website

Mein heutiger Code ist dermaßen chaotisch, dass ich den doch nicht bringe.

Den muss ich für Euch etwas aufbereiten.

Vielleicht das noch sehr unsaubere Kernstück:

 public static DialogFragment_New newInstance(String param1, String param2) {
        DialogFragment_New fragment = new DialogFragment_New();
        Bundle args = new Bundle();

        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    interface onSubmitListener {
        void setOnSubmitListener(String arg);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View rootView = inflater.inflate(R.layout.dialog_new, container, false);

        getDialog().setTitle("Neue Info");

        String test = getArguments().getString(ARG_PARAM1);

Zu Beginn stehen ja überwiegend die Teile, die von AndroidSTudio selbst produziert werden und die ich noch anpassen muss. Beim Debuggen wird ja auch noch der Parameter father von der Activity richtig übergeben. In der untersten Zeile hier ist ARG_PARAM1 aber schon wieder Null.

Vielleicht würds ja auch was helfen, wenn ich viele der eigenen Codeteile in onCreate übertrage?

Sorry für die Unübersichtlichkeit!

Antworten
  • Forum-Beiträge: 213

02.02.2016, 21:58:11 via Website

Hallo Pascal,

ich glaube, dass ich auch schon mal die von Dir vorgeschlagene Konstruktormethode vergeblich versucht hatte. Aber das wäre schon ein Ansatz, den ich noch mal verfolgen könnte.

Auf der Basis eines solchen Versuchs könnte man dann vielleicht auch besser meine Fehler aufspüren.

Das kann doch nicht so schwer sein :(

Wenn ich Deinen Vorschlag richtig verstanden habe, wäre er jedenfalls sehr schnörkellos, was ich schätze. Liegt aber wohl etwas fernab des üblichen Standardwegs. Aber den kann ich dann vielleicht später noch lernen.

— geändert am 02.02.2016, 22:00:04

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

02.02.2016, 22:44:38 via Website

Ich poste hier jetzt mal ein Beispiel das funktioniert.
Soll aber nur eine Vorrübergehende Lösung sein, ich sollte das bei mir wenn ich Zeit habe auch mal umstellen.
Vielleicht schreibe ich hier auc noch ein kleines Tut für mal sehen ob ich Zeit finde.

Ich mach das so:

public class TestFragment extends Fragment {


public ListView _listView;
OnScrollListener list;
String _catId;
int _si = 0;
SwipeRefreshLayout swipeView;
boolean searchMode = false;
View contentView;
ArrayList<Object> _list = new ArrayList<Object>();
LinearLayout loadingLayout;
ArrayAdapter<Object> adapter;
boolean isUpdating = false;
private boolean hasFirstUpdated = false;

public TestFragment() { // Default Construktor for Fragment der muss so bleiben
    _catId = "-1";

}



public TestFragment(String catId) { // konstruktor für ein Fragment mit übergebender ID
    _catId = catId;

}


public TestFragment(String catId, int pos) {// Andere Parameter mit irgendwelche überprüfungen
    _catId = catId;

    if (catId.equals("-1") & pos == 1) {
        //ok
    } else if (catId.equals("-2") & pos == 3) {
        //ok
    } else if (catId.equals("-3") & pos == 2) {
        //ok
    } else {
        //fehler


    }


}


public TestFragment(String catId, boolean searchMode) { // nochmal andere Parameter
    _catId = catId;
    this.searchMode = searchMode;
}

Damit wäre das Fragment an sich schon erledigt. Ich kann in der onCreateView etc. die gefülten Klassenvaraiblen nuten.
Du sohltest halt darauf achten dass sich das fragment nicht recreated durch einen OrientationChange o.ä., damit löscht man die Objekte.

Aufrufen kann man das ganze dann mit

Fragment f =  new TestFragment("-1", position);

Noch etwas: AndrdoidStudio wird sich mit Warnings über diese Vorgehensweise beschweren. Aber da es wie gesagt nur vorrübergehend sein soll kannst du das mal ignorieren.

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

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

02.02.2016, 23:13:04 via Website

Vielen Dank, Pascal!!!

Wirklich super, wie Du hilfst! Das werde ich mir morgen mal genauer angucken. Für heute habe ich erst mal genug :).

Antworten
  • Forum-Beiträge: 213

03.02.2016, 12:12:34 via Website

Ich war schon guter Dinge, habe aber dann gesehen, dass diese Vorgehensweise von AS nicht gewünscht wird.

In diesem Falle möchte ich mich dann doch an die Konventionen halten.

Mein nächster gescheiterter Versuch ist ja bereits im Forum zu sehen.

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

03.02.2016, 12:36:22 via Website

Wie gesagt wäre verrüberhenend dass du nicht verzweifelst ;)

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

Antworten
  • Forum-Beiträge: 213

03.02.2016, 12:58:39 via Website

Das ist sehr nett von Dir.

Habe ja jetzt mit Deiner Hilfe eine Lösung gefunden (siehe anderen Thread).

Der Königsweg geht aber wohl doch über diese Bundles etc (siehe zB hier: http://stackoverflow.com/questions/12739909/send-data-from-activity-to-fragment-in-android). Das sollte man wohl auch drauf haben.

Aber wenn Du mal eine gute Lösung findest, schaue ich mir auch die gerne an.

Antworten

Empfohlene Artikel