我正在开发一个测验应用程序,其中有一个 HomeFragment,其中包含一个带有 DrawerLayout 的 NavigationView。我已经为绑定布局创建了一个单独的类“NavigationHelpline”,并在 HomeFragment 上实现了 OnClickListener。但是,onClick 不起作用,即使我添加了它们也看不到任何日志。
每当我单击四个帮助热线布局之一时,它不会显示日志,而是关闭导航抽屉。
HomeFragment代码如下:
public class HomeFragment extends Fragment implements View.OnClickListener{
private DrawerLayout drawerLayout;
private NavigationView navigationViewRight;
private NavigationHelpline navigationHelpline;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
drawerLayout = binding.drawerLayout;
navigationViewRight = binding.navViewRight;
//To remove default behaviour of navigation view
navigationViewRight.setNavigationItemSelectedListener(null);
navigationHelpline = new NavigationHelpline(navigationViewRight);
// Set OnClickListener for Helpline buttons
navigationHelpline.setHelplineButtonsOnClickListener(this);
return root;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_audience_poll:
// Handle audience poll button click
Toast.makeText(getContext(), "btn_audience_poll clicked", Toast.LENGTH_SHORT).show();
Log.d("NavView", "btn_audience_poll clicked");
break;
case R.id.btn_fifty_fifty:
Toast.makeText(getContext(), "btn_fifty clicked", Toast.LENGTH_SHORT).show();
Log.d("NavView", "btn_fifty clicked");
break;
case R.id.btn_change_question:
// Handle change question button click
Toast.makeText(getContext(), "btn_change_question clicked", Toast.LENGTH_SHORT).show();
Log.d("NavView", "change question clicked");
break;
case R.id.btn_ask_the_expert:
// Handle ask the expert button click
Toast.makeText(getContext(), "btn_ask the expert clicked", Toast.LENGTH_SHORT).show();
Log.d("NavView", "btn_ask the expert clicked");
break;
}
}
}
这里是 home_fragment.xml 和 nav_layout.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:openDrawer="end"
tools:context=".ui.home.HomeFragment">
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/nav_layout" />
</LinearLayout>
</com.google.android.material.navigation.NavigationView>
这里是 nav_laout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="@color/black"
android:id="@+id/nav_view_right_layout">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/btn_audience_poll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:clickable="true">
<ImageView
android:id="@+id/ivAudiencePoll"
android:layout_width="100dp"
android:layout_height="50dp"
android:background="@drawable/audience"
android:layout_gravity="center"
android:layout_marginTop="4dp"
android:padding="8dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="Audience Poll"
android:textStyle="bold"
android:textSize="19sp"
android:layout_gravity="center"/>
</LinearLayout>
<LinearLayout
android:id="@+id/btn_fifty_fifty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:clickable="true">
<ImageView
android:id="@+id/ivFiftyFifty"
android:layout_width="100dp"
android:layout_height="50dp"
android:background="@drawable/fifty"
android:layout_gravity="center"
android:layout_marginTop="4dp"
android:padding="8dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="Fifty Fifty"
android:textStyle="bold"
android:textSize="19sp"
android:layout_gravity="center"/>
</LinearLayout>
<LinearLayout
android:id="@+id/btn_change_question"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:clickable="true">
<ImageView
android:id="@+id/ivChangeQuestion"
android:layout_width="100dp"
android:layout_height="50dp"
android:background="@drawable/change_ques"
android:layout_gravity="center"
android:layout_marginTop="4dp"
android:padding="8dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="Flip The Question"
android:textStyle="bold"
android:textSize="19sp"
android:layout_gravity="center"/>
</LinearLayout>
<LinearLayout
android:id="@+id/btn_ask_the_expert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:clickable="true">
<ImageView
android:id="@+id/ivAskTheExpert"
android:layout_width="100dp"
android:layout_height="50dp"
android:background="@drawable/ask_the_expert"
android:layout_gravity="center"
android:layout_marginTop="4dp"
android:padding="8dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="Ask The Expert"
android:textStyle="bold"
android:textSize="19sp"
android:layout_gravity="center"/>
</LinearLayout>
<TextView
android:id="@+id/btn_back_to_home"
android:layout_width="match_parent"
android:layout_height="25sp"
android:text="Back to Question"
android:textSize="16sp"
android:layout_marginTop="10sp"
android:textColor="@color/white"
android:textStyle="bold"
android:background="@drawable/elliptical_border"
android:gravity="center"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
这是 NavigationHelpline 类
public class NavigationHelpline {
private NavigationView navigationView;
private LinearLayout audiencePollBtn, fiftyFiftyBtn, flipQuestionBtn, askTheExpertBtn;
private TextView btnBackToHome;
public NavigationHelpline(NavigationView navigationView) {
this.navigationView = navigationView;
View includedLayout = navigationView.findViewById(R.id.nav_view_right_layout);
audiencePollBtn = includedLayout.findViewById(R.id.btn_audience_poll);
fiftyFiftyBtn = includedLayout.findViewById(R.id.btn_fifty_fifty);
flipQuestionBtn = includedLayout.findViewById(R.id.btn_change_question);
askTheExpertBtn = includedLayout.findViewById(R.id.btn_ask_the_expert);
btnBackToHome = includedLayout.findViewById(R.id.btn_back_to_home);
}
public void setHelplineButtonsOnClickListener(View.OnClickListener listener) {
audiencePollBtn.setOnClickListener(listener);
fiftyFiftyBtn.setOnClickListener(listener);
flipQuestionBtn.setOnClickListener(listener);
askTheExpertBtn.setOnClickListener(listener);
btnBackToHome.setOnClickListener(listener);
}
}
我尝试添加日志来调试问题,但我看不到任何日志。我还尝试删除 NavigationView 的默认行为并为帮助热线按钮设置 OnClickListener。尽管如此,onClick 方法仍未按预期工作。
有人可以帮我理解为什么 onClick 方法不起作用以及如何解决它吗?
我认为在使用 include 标记在 home_fragment.xml 中添加新布局时无法实现点击监听器,因为导航视图的默认行为是在导航视图内部或外部的任何视图上关闭导航视图抽屉。因此,不要使用布局,而是使用带有项目的菜单,然后将每个项目设置为 audience_poll、fifty_fifty、ask_the_expert、flip_the_question。