Android Studio中LorriesActivity无法跳转至其他Activity求助
问题:LorriesActivity无法跳转至其他页面
我正在Android Studio中开发一款Java移动应用,已创建多个Activity、用于页面导航的菜单及顶部工具栏。然而,我在从LorriesActivity进行页面跳转时遇到了问题——准确来说是完全无法从该页面跳转至其他页面,但从其他Activity跳转均无异常。我是移动开发新手,非常感谢您的帮助与关注!
相关代码
LorriesActivity.java
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.recyclerview.widget.RecyclerView; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import com.google.android.material.floatingactionbutton.FloatingActionButton; public class LorriesActivity extends AppCompatActivity { DrawerLayout drawerLayout; ImageView menu; LinearLayout timetable, messages, orders, lorries, drivers, clients, partners, company; LinearLayout logout; RecyclerView recyclerView; FloatingActionButton add_lorry_button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lorries); drawerLayout=findViewById(R.id.drawerLayout); menu=findViewById(R.id.menu); timetable=findViewById(R.id.timetable); messages=findViewById(R.id.messages); orders=findViewById(R.id.orders); lorries=findViewById(R.id.lorries); drivers=findViewById(R.id.drivers); clients=findViewById(R.id.clients); partners=findViewById(R.id.partners); company=findViewById(R.id.company); logout=findViewById(R.id.logout); recyclerView = findViewById(R.id.recyclerView); add_lorry_button = findViewById(R.id.add_lorry_button); add_lorry_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); menu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openDrawer(drawerLayout); } }); timetable.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, MainActivity.class); } }); messages.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, MessagesActivity.class); } }); orders.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, OrdersActivity.class); } }); lorries.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { recreate(); } }); drivers.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, DriversActivity.class); } }); clients.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, ClientsActivity.class); } }); partners.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, PartnersActivity.class); } }); company.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { redirectActivity(LorriesActivity.this, CompanyActivity.class); } }); logout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(LorriesActivity.this,"Ви вийшли з системи",Toast.LENGTH_SHORT).show(); } }); } public static void openDrawer(DrawerLayout drawerLayout){ drawerLayout.openDrawer(GravityCompat.START); } public static void closeDrawer(DrawerLayout drawerLayout){ if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } } public static void redirectActivity(Activity activity, Class secondActivity){ Intent intent = new Intent(activity,secondActivity); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(intent); activity.finish(); } @Override protected void onPause() { super.onPause(); closeDrawer(drawerLayout); } }
activity_lorries.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:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/drawerLayout" tools:context=".LorriesActivity"> <ScrollView android:layout_width="match_parent" android:orientation="vertical" android:padding="1dp" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/toolbar"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Вантажівки" android:textStyle="bold" android:layout_marginTop="50dp" android:textSize="30sp" /> <androidx.recyclerview.widget.RecyclerView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/recyclerView" android:layout_marginTop="20dp" android:layout_marginLeft="15dp"/> </LinearLayout> </ScrollView> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_lorry_button" android:layout_width="310dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_marginStart="28dp" android:layout_marginTop="28dp" android:layout_marginEnd="28dp" android:layout_marginRight="28dp" android:layout_marginBottom="28dp" android:clickable="true" android:focusable="true" app:srcCompat="@drawable/add" /> </RelativeLayout> <RelativeLayout android:layout_width="300dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/white"> <include layout="@layout/nav_drawer"/> </RelativeLayout> </androidx.drawerlayout.widget.DrawerLayout>
问题原因
问题出在布局结构错误:
DrawerLayout的规则是:第一个子View是主内容区域,后续子View是侧边栏(需设置layout_gravity)。- 你在主内容的
ScrollView之后,加了一个占满整个屏幕的RelativeLayout(包含FAB的那个),这个布局会覆盖在主内容和侧边栏之上,导致侧边栏里的所有点击区域(timetable、messages等LinearLayout)被遮挡,点击事件根本无法触发。 - 另外,FAB的宽度设置为
310dp过于宽大,不符合FAB的设计规范,也可能影响界面交互。
解决方案
1. 调整DrawerLayout的子View结构
将包含FAB的RelativeLayout移动到主内容的ScrollView内部,作为主内容的一部分,而不是DrawerLayout的直接子View。修改后的activity_lorries.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:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/drawerLayout" tools:context=".LorriesActivity"> <!-- 主内容区域:第一个子View --> <ScrollView android:layout_width="match_parent" android:orientation="vertical" android:padding="1dp" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/toolbar"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Вантажівки" android:textStyle="bold" android:layout_marginTop="50dp" android:textSize="30sp" /> <androidx.recyclerview.widget.RecyclerView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/recyclerView" android:layout_marginTop="20dp" android:layout_marginLeft="15dp"/> <!-- 将FAB的RelativeLayout移到这里 --> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_lorry_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_marginEnd="28dp" android:layout_marginBottom="28dp" android:clickable="true" android:focusable="true" app:srcCompat="@drawable/add" /> </RelativeLayout> </LinearLayout> </ScrollView> <!-- 侧边栏:必须设置layout_gravity --> <RelativeLayout android:layout_width="300dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/white"> <include layout="@layout/nav_drawer"/> </RelativeLayout> </androidx.drawerlayout.widget.DrawerLayout>
2. 修复FAB的宽度
将FAB的android:layout_width改为wrap_content,这是FAB的标准尺寸设置,避免过宽遮挡其他区域。
3. 优化跳转方法(可选)
redirectActivity方法中使用的Intent.FLAG_ACTIVITY_NEW_TASK在Activity内部跳转时不需要添加,因为当前Activity已经处于任务栈中。可以修改该方法:
public static void redirectActivity(Activity activity, Class secondActivity){ Intent intent = new Intent(activity, secondActivity); // 移除FLAG_ACTIVITY_NEW_TASK activity.startActivity(intent); activity.finish(); }
完成以上修改后,LorriesActivity的侧边栏点击事件就能正常触发,页面跳转功能也会恢复正常。
内容的提问来源于stack exchange,提问作者SaintSammy
相关产品推荐
相关产品推荐

