关于抽屉菜单和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。或许您可以将它与您当前的项目进行比较,以了解不同之处。
所以在过去的几天里,我一直在尝试在 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。或许您可以将它与您当前的项目进行比较,以了解不同之处。