Fragments - im Allgemeinen

  • 3 Antworten
  • Neuester Beitrag
Diskutiere Fragments - im Allgemeinen im Android App Entwicklung im Bereich Betriebssysteme & Apps.
ui_3k1

ui_3k1

Gesperrt

Hallo,
ich möchte hier kurz meine ersten Erkenntnisse zum Thema Fragments mitteilen.
Gleichzeitig habe ich schon eine konkrete Frage, bei der ich hoffe, dass jemand, der sich im Thema etwas besser auskennt als ich, mir diese beantworten kann.

Als Grundlage dient mir ein Navigation Drawer.

Der folgende Code funktioniert. Allerdings möchte ich wissen, ob diese Vorgehensweise nicht zu umständlich ist - bzw. ob es auch einfacher geht. Wenn es einfacher geht, würde mich interessieren "wie".

Was kann Probleme bei Fragments bereiten:
-ein Fragment ist keine Activity (jedenfalls nicht was die Implementierung der Funktionalität angeht - "onButtonClick" so ohne weiteres nicht möglich, da in der Main dann nach der Funktionalität "gesucht" werden würde)
-allerdings will ein Fragment behandelt werden wie eine Activity. Jedenfalls hinsichtlich des Lebenszyklus

Im folgenden Code sind meiner Meinung nach

Die .xml-Dateien
activiy_main.xml
-Stellt die einzelnen Fragment-Inhalte durch folgenden Code dar
Code:
    <!-- Framelayout zeigt versch. Fragment-Inhalte an -->

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
home_fragment.xml
-
stellt eine "Seite" mit wenig Funktionalität dar (mit einer kleinen Activity vergleichbar)
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/txtLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/start_header_txt"
        android:textSize="16dp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="92dp"
        android:text="@string/button_start_service" />

    <TextView
        android:id="@+id/tv_GPS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp"
        android:text="@string/home_gps_data_txt" />

</RelativeLayout>
Die .java-Dateien
MainActivity.java
-Bietet eine Art Schnittstelle für die Übertragung der Daten
Code:
@Override
    public void respond(String data)
    {
        FragmentManager fragmentManager = getFragmentManager();
        HomeFragment homeFragment = (HomeFragment) fragmentManager.findFragmentById(R.id.frame_container);
        homeFragment.changeText(data);
    }

HomeFragment.java

-initialisiert GUI, wenn Activity geladen und führt weitere Aktionen aus
Code:
public class HomeFragment extends Fragment implements View.OnClickListener
{
    Communicator communicator;

    Button btn_start;
    TextView textView;
    int counter = 0;

    public HomeFragment()
    {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        return rootView;
    }

    /* Button in Fragment einbauen. WICHTIG: Activity ist hier fertig geladen */
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        communicator = (Communicator) getActivity();
        btn_start = (Button) getActivity().findViewById(R.id.button1);
        textView = (TextView) getActivity().findViewById(R.id.tv_GPS);
        btn_start.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        counter++;
        communicator.respond("GPS " + counter + " !");
    }


    public void changeText(String data)
    {
        textView.setText(data);
    }
}

Communicator.java

-stellt Schnittstellen-Fktn bereit (leicht erkennbar)^^
Code:
public interface Communicator
{
    public void respond(String data);
}
Zusammengefasst:
Eigentlich springe ich "nur" auf ein Fragment (einer Activity) und löse da durch einen Button-Klick eine Counter-Erhöhung aus. Bei obigem Beispiel wird aber recht viel zusätzlicher Code benötigt, um das gangbar zu machen. Braucht es das wirklich, oder habe ich mir etwas zu viel Arbeit gemacht?
Darüber hinaus kann ich mir vorstellen, dass die Main (bzw. "übergeordneten Activities") irgendwann so voll wird/werden, dass man extrem schnell den Überblick verliert. Wie lässt sich dieses Problem angehen?

Ich hoffe es ist halbwegs nachvollziehbar wie der Code in dem Beispiel funktioniert.
Vielen Dank vorab!
 
J

JustinTime

Fortgeschrittenes Mitglied
Mit ist nicht ganz klar was du erreichen möchtest.

Du hast eine Activity die mit einem Fragment gefüllt wird. Warum erstellst du eine Schnittstelle zwischen Fragment und Activity und gibst einen Wert aus dem Fragment zurück in die Activity um von da aus weder auf das Fragment zuzugreifen.

Änder doch einfach im Fragment direkt die Textview die sowieso im Fragment liegt.
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
Wenn Du nur ein Fragment hast und brauchst, dann kann man einfach auch nur eine Standard-Activity nutzen, die im onCreate ein Layout definiert und im onClick den Button-Klick bearbeitet. Das sieht dann so aus:

Code:
package de.blabla;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
    }
    
    @Override
    public void onClick(View view)
    {
        switch (view.getId())
        {
            case R.id.button1:
                break;
                
            case R.id.button2:
                break;
            
            case R.id.button3:
                break;
                
            default:
                break;
        }
    }
}
Aber dann hat man natürlich nicht die tollen Navigationssachen. Aber für ein Fragment reicht diese Methode völlig.

EDIT: Wenn Du es jedoch mit Fragmenten machst, dann musst Du im
Code:
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState)
überprüfen, welches Fragment aktiv ist und dementsprechend die ButtonClickListener hinzufügen.
 
markus.tullius

markus.tullius

Experte
Du kannst auch mit view.setOnClickListener() arbeiten. Wenn du mit vielen Fragmente und Services arbeitest helfen BroadcastReceiver weiter. So kann man den Code sehr allgemein halten. Und die Fragmente schon mal wiederverwenden.
 
Ähnliche Themen - Fragments - im Allgemeinen Antworten Datum
3
3