Activity in Container anzeigen

  • Antworten:3
Bärbel R.
  • Forum-Beiträge: 14

14.01.2016, 18:03:23 via Website

Hallo Leute,
als Neuling habe ich ein Problem mit der Umsetzung meines Projektes für Smartphones und Tablets.
Meine MainActivity mit NavigationDrawer ruft nach Klick auf einen Drawer-Eintrag ein ListFragment auf, das eine ListView anzeigt. Beim Klick auf einen Listeneintrag starte ich für Smartphones eine 2. Tab-Activity, die 3 Fragments in verschiedenen Pages über einen ViewPager verwaltet und in der ich die Details des geklickten Listenelements verwalte.
Jetzt möchte ich für Tablets diese Lösung anpassen, wobei ich mir vorstelle, das die Anzeige der 3 Fragments neben der ListView erfolgt.
Ich habe 2 Layouts für das Listfragment in layout und layout-sw600dp aufgebaut. Dabei enthält das Layout für Tablets einen Container, in dem ich die Anzeige realisieren möchte.
In der Methode onListItemClick des Listfragments unterscheide ich beide Varianten mit:

 @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
...
        // Hat Layout Container? Nein: Tablet; Ja: SmartPhone
        if (getView().findViewById(R.id.containerDetailsActivity) != null) {
            // Tablet
            // im Ordner für Tablets layout-sw600dp
// ???
        } else {
            // SmartPhones
            // im Ordner für Tablets layout

            // Start der Activity der Details
            Intent intent = new Intent(getActivity(),MyDataDetailTabActivity.class);
            // aktuelle Werte an activity und DetailsFragmente weitergeben
            intent.putExtra(VALUE_ID, mId);
            // intent.putExtra(VALUE_TITLE, mTitle);
            // Aufruf Activity
            getActivity().startActivity(intent);
        }
    }

Das Layout für das Tablet ist:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="...schemas.android.com/apk/res/android"
    xmlns:app="...schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/linear_layout_data">
<!-- *** Tablet-Layout für DataFragment -->

<!-- Eingabebereich für neue Data + Liste -->
<LinearLayout
    android:orientation="vertical"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:id="@+id/firstLinearLayout">

    <!-- Eingabebereich für neue Data -->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/inputLayout">
    <!-- android:layout_marginRight="@dimen/marging_right" -->

        <!-- +-Button für neue MyData -->
        <ImageButton
            android:layout_width="@dimen/icon_left_size"
            android:layout_height="@dimen/icon_left_size"
            android:src="@drawable/action_create_light"
            android:id="@+id/buttonNewSlapData"
            android:layout_margin="@dimen/margin_left_icon_all"
            android:elevation="8dp"
            android:background="@drawable/round_button_backround_small"
            android:padding="@dimen/padding_icon_all"
            android:cropToPadding="true" />

        <!-- Eingabe Titel für neue MyData -->
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_top_row_text"
            android:id="@+id/editTextNewSlapData"
            android:textColor="@color/primary_text"
            android:textSize="@dimen/abc_text_size_medium_material"
            android:contentDescription="@string/description_editTextTitel"
            android:hint="@string/hint_editTextTitel"
            android:inputType="text"
            android:imeOptions="actionDone"
            android:layout_weight="1" />
        <!-- android:textSize="@dimen/primary_text_size" -->

        <!-- Zwischenspeicher für Antwort des Speichern-Dialogs -->
        <TextView
            android:id="@+id/ergebnis_vom_dialog"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <!-- Liste MyData -->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@android:id/list"
        android:divider="@color/divider"
        android:dividerHeight="@dimen/list_divider_height"
        android:listSelector="@drawable/list_selector"
        android:layout_weight="1"
        android:layout_marginTop="@dimen/margin_list_view"
        android:layout_marginBottom="@dimen/margin_list_view" />

</LinearLayout>

<!-- **** Container, in den die Activity mit den Details-Fragments kommen sollen-->
   <FrameLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="2"
    android:background="@color/secondary_text"
    android:id="@+id/containerDetailsActivity">
</FrameLayout>


Wie kann ich die geplante Details-Activity mit den 3 Fragments im Container laufen lassen? Muss ich gegebenenfalls ein anderes Steuerelement nutzen? Ich bin dankbar für Hinweise.

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

14.01.2016, 18:14:44 via Website

Ich würde dafür eine seperate Activity mit einem Master/Detail Flow benutzen.
Das gibt es schon in Tutorials und man muss es nur nachbauen:
http://www.techotopia.com/index.php/An_Android_Master/Detail_Flow_Tutorial

Damit musst du nur prüfen ob dein Endgerät ein Tablet ist (was ich auch nicht über die View machen würde..)
und dann die entsprechende Activity aufrufen.

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

Antworten
Bärbel R.
  • Forum-Beiträge: 14

15.01.2016, 08:17:59 via Website

Hallo Pascal,
vielen Dank, das Du mir wieder helfen willst.
Mit dem Konzept von Master/Detail Flow habe ich mich schon beschäftigt. Für Smartphones klappt alles. Eine Tablet-Anzeige, die den Titel meines gewählten Items in einem Detail-Fragment bringt, klappt mit meiner Architektur auch, wenn ich ein Detail-Fragment benutze (wie im Tutorial), denn der Container existiert nur für Tablets. Ich nutze dazu eine FragmentTransaction:

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
...
        // Hat Layout Container? Nein: Tablet; Ja: SmartPhone
        if (getView().findViewById(R.id.containerDetailsActivity) != null) {
            // Tablet
            // im Ordner für Tablets layout-sw600dp
            MyDataDetailsFragment myDataDetailsFragment =
                    MyDataDetailsFragment.newInstance(
                            mId,
                            mTitle,
                            0);
            // Fragment muss in Container containerDetailsActivity gepackt werden
            FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
            transaction.replace(R.id.containerDetailsActivity, myDataDetailsFragment );
            transaction.commit();
        } else {
…

Mein Problem ist, dass ich nicht nur ein Detail-Fragment habe, sondern3 Fragments in verschiedenen Pages über einen ViewPager verwalten möchte. Man kann aber "kein Fragment in ein Fragment" stecken, und deshalb möchte ich im Container nicht ein Fragment mit ViewPager, sondern eine Activity mit dem ViewPager anzeigen.

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

15.01.2016, 14:35:20 via Website

Doch man kann ein Fragment in ein Fragment integrieren. Ist etwas komplizierter aber geht, könnte nur Probleme verursachen. Aber testen lohnt sich.

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

Bärbel R.

Antworten