[JAVA] [Android] Erstellen Sie ein Schiebemenü ohne Verwendung der Navigationsansicht

Das Schiebemenü wurde mit "DialogFragment" erstellt. Es ist ein Bild, das Dialogfragment über Aktivität abdeckt.

Animation erstellen

Animation, die von links nach rechts verschoben wird (res / anim / slide_in.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="250"
        android:fromXDelta="-100%"
        android:toXDelta="0%" />

    <alpha
        android:duration="250"
        android:fromAlpha="0.8"
        android:toAlpha="1.0" />
</set>

Animation, die von rechts nach links verschoben wird (res / anim / slide_out.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="250"
        android:fromXDelta="0%"
        android:toXDelta="-100%" />

    <alpha
        android:duration="250"
        android:fromAlpha="1.0"
        android:toAlpha="0.2" />
</set>

Definieren Sie den Stil der erstellten Animation in der Datei theme.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    ....
    <style name="SlideInMenuAnimation">
        <item name="android:windowEnterAnimation">@anim/slide_in</item>
        <item name="android:windowExitAnimation">@anim/slide_out</item>
    </style>
    ....
</resources>

Erstellen eines Schiebemenüs

Layout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/slide_menu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".SlideInMenuFragment">

    <LinearLayout
        android:id="@+id/menu_area"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!--Raumrand auf gleicher Höhe wie ActionBar-->
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/design_default_color_primary"
            android:minHeight="?android:attr/actionBarSize" />

        <!--Menüteil-->
        <ListView
            android:id="@+id/menu_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</FrameLayout>

Implementierung von DialogFragment

public class SlideInMenuFragment extends DialogFragment {

    public SlideInMenuFragment() {
        // Required empty public constructor
    }

    public static SlideInMenuFragment newInstance() {
        SlideInMenuFragment fragment = new SlideInMenuFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = new Dialog(getActivity());
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.fragment_slide_in_menu);

        //Linksbündig im Vollbilddialog ausrichten
        Window window = dialog.getWindow();
        window.getAttributes().windowAnimations = R.style.SlideInMenuAnimation;
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        window.setGravity(Gravity.TOP | Gravity.START);
        window.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);

        //Legen Sie die Stammansicht von Layout fest
        FrameLayout rootView = dialog.findViewById(R.id.slide_menu);
        onViewCreated(rootView, savedInstanceState);
        return dialog;
    }

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

        String[] menuArray = {"Speisekarte", "Speisekarte", "Speisekarte"};
        //Stellen Sie den Inhalt des Menüs ein
        ListView menu = view.findViewById(R.id.menu_list);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1, menuArray);
        menu.setAdapter(adapter);
    }
}

Anruf von MainActivity

public class MainActivity extends AppCompatActivity {

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

        //Stellen Sie eine Schaltfläche am linken Rand der Aktionsleiste ein
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            //Das Symbol ↓ verwendet das Standardsortiersymbol, es ist jedoch hilfreich, es in ≡ zu ändern.
            actionBar.setHomeAsUpIndicator(android.R.drawable.ic_menu_sort_by_size);
        }
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            //Menüanzeige
            FragmentManager fragmentManager = getSupportFragmentManager();
            SlideInMenuFragment fragment = SlideInMenuFragment.newInstance();
            fragment.show(fragmentManager, fragment.getClass().getSimpleName());
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
}

Ergebnis

Klicken Sie auf das Symbol links neben der Aktionsleiste image.png  ↓ image.png Das Menü wird geöffnet. Tippen Sie auf den transparenten Teil des Hintergrunds, um das Menü zu schließen.

Hinweis

Mit dieser Implementierung können Sie Gesten bedienen und das Menü wird nicht angezeigt. Ich habe diese Methode implementiert, weil ich das Menü selbst ändern musste, aber Immerhin ist es besser, NavigationView zu verwenden.

Recommended Posts

[Android] Erstellen Sie ein Schiebemenü ohne Verwendung der Navigationsansicht
Erstellen Sie eine Lotterie mit Ruby
Erstellen Sie ein Tomcat-Projekt mit Eclipse
Erstellen Sie ein Java-Projekt mit Eclipse
Erstellen Sie eine Filterfunktion mit Acts-as-Taggable-On
[Kotlin / Android] Erstellen Sie eine benutzerdefinierte Ansicht
Erstellen Sie mit Docker schnell eine Webumgebung
Erstellen Sie mit Grape einen RESTful-API-Service
Erstellen Sie eine Anmeldefunktion mit Swift's Optional
Realisieren Sie eine Entscheidungstabelle ohne bedingte Verzweigung
Erstellen Sie mit Docker sofort eine Privoxy + Tor-Umgebung
[Android] Erstellen Sie eine neue Klasse, indem Sie ImageView erben
Erstellen wir eine REST-API mit WildFly Swarm.
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
Erstellen Sie eine Spring Boot-Anwendung mit IntelliJ IDEA
Wenn Sie eine vollständige äußere Verknüpfung ausführen, ohne die vollständige äußere Verknüpfung zu verwenden
Erstellen Sie eine Umgebung für Tomcat und Postgres auf Chromebook, ohne den Entwicklermodus zu verwenden
Erstellen Sie eine Java-Entwicklungsumgebung mit jenv auf Ihrem Mac
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
Ein Memorandum beim Versuch, eine GUI mit JavaFX zu erstellen
Finden Sie den Rest geteilt durch 3, ohne eine Zahl zu verwenden
Erstellen Sie in JavaFX ein rahmenloses, nicht rechteckiges Fenster ohne Taskleiste
Erstellen Sie mit der Sitzungsfunktion einen Anmeldeauthentifizierungsbildschirm