关于抽屉菜单和onClick的问题

Questions regarding Drawer menu and onClick

所以在过去的几天里,我一直在尝试在 AndroidStudio 中做一些基本的事情,但我注意到即使是最基本的事情也不起作用。我认为原因是我按照 YouTube 教程使 NavigationDrawer 具有经典菜单。但是由于这个原因,我无法在任何“子菜单”中推出按钮。它首先从地图开始,我什至无法在地图上放置标记,整个过程都不​​起作用。接下来我尝试制作一个 ImageButton,但它不起作用,然后我发现经典的 Button 也不起作用。 MainActivity.java 中的所有内容都有效,但是当我将 layout.id.fragment_morning 放入 MorningActivity.java 时,它不起作用。

MainActivity.java

package com.example.mcdonaldscoupons;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.widget.Toast;
import android.widget.Toolbar;

import com.google.android.material.navigation.NavigationView;

import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import static android.Manifest.permission.INTERNET;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    private DrawerLayout drawer;
    private Intent Home;
    private Object NavigationUI;
    boolean isPressed = false;
    public static final int RequestPermissionCode = 7;

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

        androidx.appcompat.widget.Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
                R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new HomeFragment()).commit();
            navigationView.setCheckedItem(R.id.nav_home);
        }
    }

    //Funkčnost fragmentů *START*

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.nav_home:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new HomeFragment()).commit();
                break;
            case R.id.nav_morning:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new MorningFragment()).commit();
                break;
            case R.id.nav_afternoon:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new AfternoonFragment()).commit();
                break;
            case R.id.nav_info:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new InfoFragment()).commit();
                break;
            case R.id.nav_map:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new MapFragment()).commit();
                break;
            case R.id.nav_other:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new OtherFragment()).commit();
                break;
            case R.id.nav_share:
                Intent i = new Intent(Intent.ACTION_SEND);
                i.setType("text/plain");
                String sharebody = "Podívej co Vojtí vytvořil!";
                String subject = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
                i.putExtra(android.content.Intent.EXTRA_SUBJECT, sharebody);
                i.putExtra(android.content.Intent.EXTRA_TEXT, subject);
                startActivity(Intent.createChooser(i, "Pošli to někomu ne?"));
                break;
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    //Funkčnost fragmentů *KONEC*
    //Double-back exit *START*

    @Override
    public void onBackPressed() {


        if (isPressed) {
            finishAffinity();
            System.exit(0);
        } else {
            Toast.makeText(getApplicationContext()
                    , "Klikni ještě jednou pro vypnutí!"
                    , Toast.LENGTH_SHORT).show();
            isPressed = true;
        }
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                isPressed = false;
            }
        };
        new Handler().postDelayed(runnable, 2000);
    }

    //Double-back exit *KONEC*
    //Other stuff

    private void setSupportActionBar(Toolbar toolbar) {
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity"
    tools:openDrawer="start">

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

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/dark_green"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/drawer_menu" />

</androidx.drawerlayout.widget.DrawerLayout>

MorningActivity.java

package com.example.mcdonaldscoupons;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import androidx.fragment.app.Fragment;

public class MorningActivity extends Fragment implements View.OnClickListener {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_morning, container, false);

        Button b = (Button) v.findViewById(R.id.test_product);
        b.setOnClickListener(this);
        return v;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.test_product:
                Toast.makeText(getContext().getApplicationContext(), "TEST",Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

fragment_morning.xml

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:id="@+id/fragment_morning"
    tools:context="com.example.mcdonaldscoupons.MorningActivity">

    <Button
        android:id="@+id/test_product"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/test_product"
        android:layout_gravity="center"
        android:layout_marginStart="-85dp"
        android:layout_marginLeft="-85dp"
        android:layout_marginBottom="-139dp"
        android:layout_toEndOf="@+id/test_product"
        android:layout_toRightOf="@+id/test_product"
        android:clickable="true"
        android:text="2x McMuffin Menu"
        android:textColor="@color/black"
        android:textSize="35dp"
        android:textStyle="bold"></TextView>
</RelativeLayout>

MorningFragment.java

package com.example.mcdonaldscoupons;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import org.jetbrains.annotations.NotNull;

public class MorningFragment extends Fragment {

    @Nullable
    @org.jetbrains.annotations.Nullable
    @Override
    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_morning, container, false);
    }
}

drawer_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_home"
            android:title="Domů" />
        <item
            android:id="@+id/nav_morning"
            android:icon="@drawable/ic_morning"
            android:title="Snídaně" />
        <item
            android:id="@+id/nav_afternoon"
            android:icon="@drawable/ic_afternoon"
            android:title="Obědy" />
        <item
            android:id="@+id/nav_other"
            android:icon="@drawable/ic_other"
            android:title="Různé" />
    </group>

    <item android:title="Ostatní">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_map"
                    android:icon="@drawable/ic_map"
                    android:title="Mapa mekáčů" />
                <item
                    android:id="@+id/nav_info"
                    android:icon="@drawable/ic_info"
                    android:title="O aplikaci" />
            </group>
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/ic_share"
                android:title="Sdílet" />
        </menu>
    </item>

</menu>

我看到你有一个 MorningActivity 扩展了一个 Fragment class,这是故意的吗?我希望它是 AppCompatActivity.

的扩展

否则尝试将逻辑移动到 OnViewCreated 方法,并且只在 OnCreateView 中扩充布局,如 docs

中所述

It is recommended to only inflate the layout in this method and move logic that operates on the returned View to onViewCreated(View, Bundle).

从您的代码片段来看,似乎从未使用或调用过 MorningActivity,我确实看到在 MainActivity 中调用了 MorningFragment。但是因为 MorningFragment 中没有任何逻辑 class 我希望您只会看到布局,但是当您按下按钮时不会触发任何内容。

如果这是问题所在,您可以删除 Morning Activity 并将逻辑从按钮按下侦听器移动到 OnViewCreated 方法中的片段。示例:

public class MorningFragment extends Fragment {

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

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

        view.findViewById(R.id.test_product).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getContext().getApplicationContext(), "TEST",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

最后,当您创建一个新项目时,您还可以 select 一个模板,例如导航抽屉 Activity。或许您可以将它与您当前的项目进行比较,以了解不同之处。