[JAVA] Implementierung von Registerkarten mit TabLayout und ViewPager

Ich werde zum ersten Mal auf Qiita posten! Bis jetzt habe ich die Artikel vieler Leute gesehen und viel studiert, aber ich werde versuchen, Artikel zu schreiben, die für viele Leute hilfreich sind, also danke.

Was das Hauptthema betrifft, wollte ich bei Verwendung von TabLayout die Fragment-Methode aufrufen, indem ich auf das Symbolleistenmenü von Aktivität klickte. Die Seite, die auf leicht verständliche Weise geschrieben wurde, konnte ich jedoch nicht finden. Daher werde ich sie zusammenfassen. Zunächst werde ich eine einfache Tab-Implementierung mit TabLayout und ViewPager vorstellen. Es gibt viele Artikel, in denen die Implementierung von Registerkarten vorgestellt wird. In diesem Artikel werde ich jedoch auf Materialdesign eingehen und es erstellen. Im nächsten Artikel werde ich zusammenfassen, wie Fragment aus Aktivität und Aktivität aus Fragment betrieben werden.

Implementierung von Registerkarten (bis zur Anzeige)

TabLayout Dieses Mal erstellen wir so etwas wie eine Symbolleiste und eine integrierte Registerkarte. Mit TabLayout können Registerkarten festgelegt werden, die dem Materialdesign entsprechen, ohne detaillierte Einstellungen vorzunehmen. Blenden Sie die Aktionsleiste in style.xml aus, schreiben Sie die Symbolleiste in Layout und werfen Sie einen Schatten auf das TabLayout. Es ist erforderlich, die Hintergrundfarbe von Symbolleiste und TabLayout anzupassen.

Die Höhe der Symbolleiste in Material Design beträgt 4 dp. Sie können auch @ dimen / abc_action_bar_elevation_material verwenden. Elevation & shadows - Material Design

values/styles.xml


<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

layout/activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="...MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:title="Tab Sample"
        app:titleTextColor="@color/white"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            style="@style/MyCustomTabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:elevation="4dp" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
</LinearLayout>

@ style / MyCustomTabLayout ist ein Originalstil, der die Textfarbe einer Registerkarte ändert, wenn sie ausgewählt ist und wenn sie nicht ausgewählt ist. In Material Design ist die Textfarbe der ausgewählten Registerkarte #fff und die Textfarbe der nicht ausgewählten Registerkarte # fff / Deckkraft 70%. Tabs - Components - Material Design Zusammenfassung der Transparenz des ARGB-Farbcodes - Qiita

values/styles.xml


<resources>
    ...

    <style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabTextAppearance">@style/MyCustomTabText</item>
        <item name="tabSelectedTextColor">@color/white</item>
    </style>

    <style name="MyCustomTabText" parent="TextAppearance.AppCompat.Button">
        <item name="android:textColor">@color/white_70percent</item>
    </style>
</resources>

Fragment Erstellen Sie als Nächstes ein Fragment. Die Rolle von Fragment bei der Implementierung von Registerkarten kann über den Adapter in ViewPager eingeführt werden, um Benutzerinteraktionen zu akzeptieren. Und jedes Mal, wenn sich die Auswahl der Registerkarten ändert, wechselt das von ViewPager angezeigte Fragment. Sie müssen also so viele Fragmente erstellen, wie Registerkarten vorhanden sind. (Wenn sich der Benutzer bei mehreren Registerkarten gleich verhalten muss, kann ein Fragment mit weniger Fragmenten als der Anzahl der Registerkarten implementiert werden, indem es mehreren Registerkarten entspricht.) Das Fragment ähnelt der Aktivität. Es besteht aus einer Klasse / Java-Datei und einer Layout / XML-Datei. Und da Fragment einen Lebenszyklus hat, kann es auf die gleiche Weise wie Aktivität verwendet werden. Beachten Sie jedoch, dass sich der Fragmentlebenszyklus vom Aktivitätslebenszyklus unterscheidet.

Main1Fragment.java


package ...;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Main1Fragment extends Fragment {

    public Main1Fragment() {
    }

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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }
}

Main2Fragment.java


package ...;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Main2Fragment extends Fragment {

    public Main2Fragment() {
    }

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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }
}

Dies ist die Grundform des Fragments. Die OnCreatedView () -Methode gibt eine aufgeblasene Ansicht des Fragmentlayouts zurück. Die onViewCreated () -Methode kann auf dieselbe Weise wie die onCreate () -Methode in Activity verwendet werden. Da die ursprüngliche Operation zum Überschreiben von super.onViewCreated (view, savedInstanceState) ausgeführt wird, wird nachfolgend beliebiger Code beschrieben.

Ändern Sie hier das Layout des Fragments, damit die beiden Layouts unterschieden werden können. Ändern Sie jetzt nur den Text der Textansicht.

layout/fragment_main1.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp"
    tools:context="...Main1Fragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="fragment1" />

</LinearLayout>

layout/fragment_main2.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp"
    tools:context="...Main2Fragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="fragment2" />

</LinearLayout>

Adapter Erstellen Sie als Nächstes einen Adapter. Der Adapter ist ein Mechanismus zum Einführen von Fragment in ViewPager. Der Adapter, der in ViewPager festgelegt werden kann, ist ein Adapter, der FragmentPagerAdapter erbt.

OriginalFragmentPagerAdapter.java


package ...;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;

public class OriginalFragmentPagerAdapter extends FragmentPagerAdapter {

    private CharSequence[] tabTitles = {"Tab 1", "Tab 2"};

    public OriginalFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles[position];
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new Main1Fragment();
            case 1:
                return new Main2Fragment();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return tabTitles.length;
    }
}

Deklarieren Sie den Titel der Registerkarte mit einem Array vom Typ CharSequence. Methode getCount (): Gibt die Gesamtzahl der Registerkarten zurück. Methode getPageTitle (): Die Tabulatortitel für die Gesamtzahl der Tabulatoren werden auf der Registerkarte angezeigt. Methode getItem (): Reflektiert das der Position entsprechende Fragment. Wird jedes Mal aufgerufen, wenn Sie eine Registerkarte auswählen. Zu diesem Zeitpunkt erhält es eine Position als Argument, sodass das dieser Position entsprechende Fragment zurückgegeben wird. Activity Schließlich ist es die Einstellung der Aktivität.

MainActivity.java


package ...;

import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        OriginalFragmentPagerAdapter adapter = new OriginalFragmentPagerAdapter(getSupportFragmentManager());
        ViewPager viewPager = findViewById(R.id.viewPager);
        viewPager.setOffscreenPageLimit(2);
        viewPager.setAdapter(adapter);

        TabLayout tabLayout = findViewById(R.id.tabLayout);
        tabLayout.setupWithViewPager(viewPager);
    }
}

Deklarieren Sie den OriginalFragmentPagerAdapter. Sie können eine Instanz erstellen, indem Sie FragmentManager als Argument verwenden und beim Deklarieren getSupportFragmentManager () übergeben. Verknüpfen Sie ViewPager mit der ID des Layouts und legen Sie den Adapter mit der Methode setAdapter () fest. Die Methode setOffscreenPageLimit () gibt als Argument an, wie viele Seiten vor dem Fragment beibehalten werden sollen, wenn der Benutzer die Seite von ViewPager ändert. Wenn Sie diesen Wert beispielsweise in ViewPager, in dem 3 Fragmente eingeführt wurden, auf 2 setzen, wird die erste Seite neu generiert, wenn Sie von Seite 1 zu Seite 3 wechseln und zu Seite 1 zurückkehren. Wenn Sie den Wert usw. beibehalten und verhindern möchten, dass er erneut geladen wird, müssen Sie daher OffscreenPageLimit (3) festlegen. TabLayout ist dann die setupWithViewPager () -Methode. Wenn Sie den ViewPager mit dem Adapter-Set festlegen, wird beim Klicken auf eine Registerkarte das dieser Registerkarte entsprechende Fragment im ViewPager angezeigt.

Fragmentoperation

Mit den oben genannten Informationen können Sie das Fragment mit einem statischen Layout anzeigen, in dem sich die Textansicht befindet, und Sie können bestätigen, dass das Fragment des ViewPagers durch Betätigen des ViewPagers und der Registerkarten umgeschaltet werden kann. Als nächstes empfängt es die Operation des Benutzers in Fragment. Schreiben wir ein Programm, das einen EditText und eine Schaltfläche im Layout des Fragments erstellt, beim Klicken auf die Schaltfläche eine Zeichenfolge von EditText empfängt und in Toast anzeigt.

Ändern Sie das Layout des Fragments.

layout/fragment_main1.xml


<LinearLayout ...>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="fragment1" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button_Fragment1" />
</LinearLayout>

Ändern Sie die Fragment-Java-Datei.

Main1Fragment.java


...

public class Main1Fragment extends Fragment {
    ...

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        final EditText editText = view.findViewById(R.id.editText);
        Button button = view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), editText.getText().toString(), Toast.LENGTH_LONG).show();
            }
        });
    }
}

Um die Ansichts-ID des Layout-Layouts des Fragments zu verbinden, schreiben Sie sie als view.findViewById (R.id ...) in die Methode onViewCreated (). Die Argumentansicht ist die Ansicht, die von der OnCreatedView () -Methode beim Erstellen des Fragments zurückgegeben wurde, sodass Sie die ID aus diesem Layout zuordnen können. In Bezug auf die Stelle, an der Toast angezeigt wird, ist das erste Argument Kontext von makeText getContext (). Hier haben Sie MainActivity.this, this, getApplicationContext () usw. in Activity geschrieben. Sie können jedoch die Aktivität des übergeordneten Elements, in dem das Fragment ausgeführt wird, erhalten, indem Sie getContext () in Fragment schreiben.

Schließlich

Jetzt können Sie die grundlegenden Registerkarten implementieren. Im nächsten Artikel Operation "Aktivität zu Fragment" - Qiita möchte ich vorstellen, wie die Fragmentmethode von Aktivität aufgerufen wird. Ich werde.

Recommended Posts

Implementierung von Registerkarten mit TabLayout und ViewPager
[Rails] Implementierung der automatischen Adresseneingabe mit jpostal und jp_prefecture
Implementierung der Validierung mit regulären Ausdrücken
Standardimplementierung von Object.equals () und Object.hashCode ()
[Rails] Implementierung der Tag-Funktion mit Acts-as-Taggable-On und der Funktion zur Vervollständigung der Tag-Eingabe mit Tag-It
[Android] Implementierung von SideVolling ListView mit RecyclerView
Verbleib der JAXB-Referenzimplementierung und von DatatypeConverterImpl
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
[FCM] Implementierung der Nachrichtenübertragung mit FCM + Spring Boot
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Einfache Installation von Nginx und Docker mit ansible
[Rails] Implementierung des PV-Nummernrankings mit Impressionist
[Rails] Implementierung einer Bild-Diashow mit Bootstrap 3
Implementierung der Google-Anmeldung mithilfe der Google OAuth 2.0-Authentifizierung (Server Edition)
[Rails] Implementierung der Drag & Drop-Funktion (mit Wirkung)
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Vorbereitung"
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der "Seed Edition" der Vorfahren
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden
iOS App Entwicklung: Timer App (5. Implementierung von Alarm und Vibration)
Implementierung der Suchfunktion
Beispiel für die Verwendung von vue.config.js
Angewandte Implementierung von Chat-Space
Zusammenfassung der Verwendung von FragmentArgs
Implementierung der Pagenationsfunktion
Zusammenfassung der Verwendung von DBFlow
Implementieren einer Datenbank mit Realm
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Edit Form Edition"
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Erstellen Sie weitere Registerkarten und Fragmente im Fragment von BottomNavigationView