Verständnis Fragen zu TabView (Objekte übernehmen)

  • Antworten:7
Laire
  • Forum-Beiträge: 71

03.09.2014, 16:17:16 via Website

Hallo,

Ich hoffe ich habe das so richtig verstanden:

Ein TabView bestaht ja aus einer Activity und den Fragmenten (Klassen), in meinem Fall zwei, mit dem jeweiligen Layout.
Wenn ich jetzt den Tab wechsle, lädt er die jeweilige Klasse. Jetzt habe ich Objekte, die ich in beiden Views brauche.

Kann ich diese Objekte in der Activity laden und dann in den Fragmentklassen nutzen? Wenn ja wie?

So würde ich das Objekt in der Activity initialisieren:

e2settings      = new e2(getApplicationContext());

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.09.2014, 16:25:51 via App

Kannst du das bitte genauer erklären.
Ich habe es noch nicht verstanden.
Du willst dein Settingsobjekt im allen 3 Fragments nutzen oder?
Dafür würde ich ne static Variable in der Activity machen und diese in den Fragments lesen.

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

Antworten
Laire
  • Forum-Beiträge: 71

03.09.2014, 17:27:37 via Website

Ich versuche es genauer:

ich habe eine Main Activity:

public class settingsMain extends FragmentActivity implements ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
private String[] tabs = { "E2Box", "Chromecast" };

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

    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {

    switch (index) {
        case 0:
            return new settingsE2();
        case 1:
            return new settingsCast();
    }

    return null;

}

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

}

Wenn ich das ganz Prinzip richtig verstanden habe, ist der Adapter dafür zuständig welcher Tab angezeigt wird.

Die Klasse des einen Tab sieht so aus:

public class settingsE2 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_settings_e2, container, false);

        e2settings      = new e2(getActivity().getApplicationContext());
        networkHelper   = new network(getActivity().getApplicationContext());

        return rootView;
    }
}

und das ist die XML Datei (gekürzt):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="de.resper.enigma2chromecast.settingsE2">

    <TextView
        android:id="@+id/e2Status"
        android:text=""
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="20sp"
        android:padding="10dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:textSize="20sp"
        android:id="@+id/editIp"
        android:layout_margin="10dp"
        android:hint="@string/ip"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/scanDevices"
        android:id="@+id/scanDevices"
        android:onClick="scanNetwork"
        android:layout_gravity="center_horizontal"
        android:padding="20dp"/>
</LinearLayout>

Konkrete Fragen:

  1. Wo integriere ich zum Beispiel einen Listener für den TextEdit oder einen setText, in der Main oder der Klasse?
  2. Schreibe ich Abläufe, die beim Öffnen des Tabs erfolgen sollen (zum Beispiel testen der aktuellen Konfiguration und Manipulation von TextViews in die main oder in die Klassen?
  3. Wenn ich das ganze in die Klassen schreibe und zum Beispiel das im ersten Beitrag erstelle Objekt in beiden Fragmenten brauche kann ich das in der Main erstellen und dann in den Fragmenten verwenden?

Evtl stelle ich mir es auch völlig falsch vor wie das ganze funktioniert. Ich gehe davon aus, dass die Main im Hintergrund läuft und alles verwaltet und die Fragmente bei bedarf dann dazu lädt. Wo ich dann denke es wäre doch logisch, wenn man in der Main Objekte definiert, die dann vom jeweils aktiven Fragment genutzt und verändert werden können.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.09.2014, 17:40:26 via Website

So in der Art ist es auch.
Aber um es einfacher zu machen, kannst du dir auf vorstellen das Fragment wäre eine eigenständige Activity ( vom Programmierprinzip der Fragmentoberfläche) etc.
Die eigentliche Activity ist nur für Verwaltung,Navigation etc. zuständig.

Nun zu deinen Fragen:
1.
Hier ist es wichtig, wo dein Textfeld definiert ist.
Wenn es auf dem Fragment Layout ist kommt es auch ins Fragment (Klasse) rein.

2 . Beim öffnen des Tabs wird ja auch das Fragment geöffnet.
Also wenn das testen an sich bei jedem Fragment der gleiche Code ist, kannst du es in der Main machen.
Sonst im Fragment.
Und Testfelder änder etc. immer im Fragment.
Hier gilt: onCreateView(..) <gleiche funktion wie >onCreate(..) [in einer Activity]

3.
Ja du kannst es in der Activity anlegen,
dann musst du aber überlegen, wann du die Objekte ins Fragment per Parameter übergeben musst.

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

Antworten
Laire
  • Forum-Beiträge: 71

03.09.2014, 18:24:42 via Website

Wird denn beim wechseln des Tabs das Fragment neu geladen oder handelt es sich dann um eine Art von onResume?

— geändert am 03.09.2014, 18:39:05

Antworten
Sven R.
  • Forum-Beiträge: 1.904

03.09.2014, 18:57:00 via App

Kannst du einfach per LogCat austesten.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Laire
  • Forum-Beiträge: 71

29.09.2014, 20:15:22 via Website

Also ich habe das oben genannte Beispiel, etwas abgeändert nun in Verwendung.

Jetzt brauche ich

e2settings = new e2(getActivity().getApplicationContext());

in der Main und im Fragment.

Für die Main gibt es in dem Object gibt es eine Prüfung ob Parameter gespeichert sind, wenn nicht wird zur Erstellung einer neuen Settings geleitet.
Im Fragment wird das Object benötigt, um die aktuellen Einstellungen aus zu lesen.

Mit Hilfe von Logcat habe ich nun festgestellt, das das Objekt 1 x in der main erstellt wird (was ja klar ist), aber komischerweise 2 x im Fragment wobe es nur einmal im Code steht.

Per Google habe ich die Aussage gefunden, dass dieses Verhalten normal ist (also das onCreateView mehrfach ausgeführt wird) warum habe ich nicht ganz verstanden, und dass man, das Objekt in der Main erstellen und dann an das Fragment übergeben soll.

Das Beispiel von Google (http://developer.android.com/training/basics/fragments/communicating.html) konnte ich nicht wirklich auf mein Beispiel umsetzten.

Vielleicht könnt Ihr mir ja nochmal helfen.

— geändert am 29.09.2014, 20:16:09

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.09.2014, 20:28:03 via App

In der Main:
...new settings();
...

Fragment f = new Fragment(settings);

Im Fragment:

Fragment(e2settings s)
this.settings= s;

  1. Möglichkeit.

Globals Datei mit solchen variablen.
public static final settings = new settings(),

Main:

Globals.settings.(...)

Fragment

Globals.settings.(...)

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

Antworten