Text in TextView bei einem Fragment ändern

  • Antworten:5
Trispold
  • Forum-Beiträge: 3

15.03.2020, 21:40:08 via Website

Hallo liebes AndroidPIT-Forum,

ich bin gerade dabei, ein Unterrichtsprojekt (BinarySearchTree) in eine App umzuwandeln. Durch die verlängerten Ferien habe ich dazu auch Zeit. ;)

Mein Problem:
Ich benutze einen ViewPager (CollectionPagerAdapter), der meine Fragmente (fGrafik, fVerwaltung und fAusgabe) verwaltet. Wenn ich das Projekt erstelle erscheint wie gewünscht in dem Fragment fAusgabe ein TextView mit dem Inhalt "Konsole\n\n". Wenn ich dann aber diesen Text verändern möchte (z.B. mit dem append-Befehl) bekomme ich eine NullPointerException.

Kann mir jemand weiterhelfen?

Start.java

public class Start extends AppCompatActivity{
CollectionPagerAdapter collectionPagerAdapter;
ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.start);

    collectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(collectionPagerAdapter);
    final ActionBar actionBar = getSupportActionBar();
    [...]
    this.ausgabe("Ausgabe 1");
}

public void ausgabeLoeschen(){
  ((TextView)this.collectionPagerAdapter.gibFAusgabe().getView().findViewById(R.id.konsole)).setText("Konsole:\n\n");
}

public void ausgabe(String pInhalt){
   ((TextView)this.collectionPagerAdapter.gibFAusgabe().getView().findViewById(R.id.konsole)).append(pInhalt);
}

}

start.xml

<FrameLayout
xmlns:android="ht tp://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_container">

<android.support.v4.view.ViewPager xmlns:android="ht tp://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager></FrameLayout>

CollectionPagerAdapter.java

public class CollectionPagerAdapter extends FragmentStatePagerAdapter{
private GrafikFragment fGrafik;
private VerwaltungFragment fVerwaltung;
private AusgabeFragment fAusgabe;

public CollectionPagerAdapter(FragmentManager pFM){
    super(pFM);
    fGrafik = new GrafikFragment();
    fVerwaltung = new VerwaltungFragment();
    fAusgabe = new AusgabeFragment();
}

@Override
public Fragment getItem(int i){
    Fragment fragment = null;
    Bundle args = new Bundle();
    switch (i){
        case 0:
            fragment = fGrafik;
            args.putInt(GrafikFragment.ARG, i+1);
            break;
        case 1:
            fragment = fVerwaltung;
            args.putInt(VerwaltungFragment.ARG, i+1);
            break;
        case 2:
            fragment = fAusgabe;
            args.putInt(AusgabeFragment.ARG, i+1);
            break;
    }
    fragment.setArguments(args);
    return fragment;
}

@Override
public int getCount(){
    return 3;
}

@Override
public CharSequence getPageTitle(int position){
    switch(position){
        case 0:
            return "Grafik";
        case 1:
            return "Verwaltung";
        case 2:
            return "Ausgabe";
    }
    return "";
}

public GrafikFragment gibFGrafik(){
    return fGrafik;
}

public VerwaltungFragment gibFVerwaltung(){
    return fVerwaltung;
}

public AusgabeFragment gibFAusgabe(){
    return fAusgabe;
}}

AusgabeFragment.java

public class AusgabeFragment extends Fragment{
public static final String ARG = "parameter";
private View root;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){
    root = inflater.inflate(R.layout.fragment_ausgabe, container, false);
    Bundle args = getArguments();
    String param = "Konsole:\n\n";
    ((TextView) root.findViewById(R.id.konsole)).setText(param);
    return root;
}}

fragment_ausgabe.xml

<FrameLayout xmlns:android="ht tp://schemas.android.com/apk/res/android"
xmlns:tools="ht tp://schemas.android.com/tools"
android:id="@+id/collectionAusgabe"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AusgabeFragment">

<TextView
    android:id="@+id/konsole"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/></FrameLayout>
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

16.03.2020, 06:12:53 via Website

Hallo wo und wie wisst du ihn denn verändern?

In der fragment Klasse sehe ich nichts wo du was ändern willst.

Hilfreich?
Pascal P.
Kommentieren
Trispold
  • Forum-Beiträge: 3

16.03.2020, 09:36:37 via Website

In der Start-Klasse die Funktion "ausgeben". Diese soll an den Text "Konsole:\n\n" die Konsolenausgabe anhängen.

Ich hatte diese Methode auch einmal in die Fragmentklasse ausgelagert, aber es gab trotzdem eine NullPointerException.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.03.2020, 11:56:29 via Website

Du erstellst deine Fragments mittels Konstruktor:

  fGrafik = new GrafikFragment();
    fVerwaltung = new VerwaltungFragment();
    fAusgabe = new AusgabeFragment();

Soweit ok.
Die View wird aber im Fragment erst mittels onCreateView vom System aufgerufen.
D.h. du hast zwar ein Fragment Objekt aber ohne View.
Diese wird erst erstellt, wenn das Fragment angezeigt wird.

Da du nun Text auf dein Ausgabe Fragment (3.) direkt in der onCreate setzen willst, bekommst du eine NullPointerException da die View zu diesem Zeitpunkt nicht geladen wurde, weil das Framgnet nicht angezeigt wird.
Somit musst du erstens prüfen ob es die View schon gibt und nur dann wenn diese != null ist kannst du das Textfeld finden.
Ansonsten wirst du warten müssen, bis das Fragment angezeigt wird und den Text erst setzen, in dem Moment in dem die View geladen ist.

Um sowas herauszufinden, sollte man sich etwas mit dem Android View System und Lifecycle beschäftigen.

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

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

16.03.2020, 15:32:53 via Website

Hallo ich finde es auch etwas falsch das du das ändern direkt in der onCreate machen willst.
So etwas macht man eigentlich in einem listner. Und nach prüfen ob auch das richtige Fragment geladen angezeigt wird. Erst dann kannst du auf deine View zugreifen.

Der Sinn das direckt in der onCreate der activity zumachen erschließt sich mir nicht.

Hilfreich?
Kommentieren
Trispold
  • Forum-Beiträge: 3

16.03.2020, 15:35:50 via Website

Das war eher als Test gedacht, ob die ausgeben Methode funktioniert. Aber jetzt weiß ich ja, weshalb nicht.

Hilfreich?
Kommentieren