【问题标题】:OnClick for navigation drawer header not workingOnClick 导航抽屉标题不起作用
【发布时间】:2015-07-30 05:49:56
【问题描述】:

我的应用中有一个导航抽屉,其中包含标题和一些列表项。标题有一个文本视图,我想使其可点击,但我无法做到。

为了获取这个 textview 的 id,我使用了以下代码,因为与 onCreate 中的 setContentView 中的布局文件相比,它位于不同的布局文件中。

    final LayoutInflater factory = getLayoutInflater();

    final View textEntryView = factory.inflate(R.layout.header, null);

    TextView home = (TextView) textEntryView.findViewById(R.id.home);
    home.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(curr_context, "SHOW", Toast.LENGTH_LONG).show();

        }
    });

header.xml 包含导航抽屉的标题。它有一个名为 home 的项目。我需要让它可点击。以上代码在onCreate方法中。

【问题讨论】:

  • 您不会将标题放在 NavigationView 中,是吗? NavigtionView 在内部将标题放置在嵌套 ListView 视图中的插槽 0 中,然后拦截并丢弃标题的 OnItemClicked 事件。这可能是问题的根源吗?不太确定起作用的机制,但如果标题位于重要信息的 NavigationView 中。
  • 仔细看,我发现我确实按照你说的做了。有没有办法让它在这种情况下工作?谢谢!!
  • 最好将标题放在导航视图之外。或者根本不使用 NavigationView(因为它通常似乎会导致比它解决的问题更多的问题)。它基本上是一个带有菜单适配器代码的精美损坏的列表视图(这不是一个很棒的功能)。

标签: android onclick navigation-drawer


【解决方案1】:

对我来说,其他答案不起作用。 我试过下面的代码。 我知道为时已晚。希望这会有所帮助。

我做了什么来访问标题视图。

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
View headerview = navigationView.getHeaderView(0);
TextView profilename = (TextView) headerview.findViewById(R.id.prof_username);
profilename.setText("your name")

为了点击header的views,这里我使用了headerview的linearlayout

LinearLayout header = (LinearLayout) headerview.findViewById(R.id.header);
header.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(HomeActivity.this, "clicked", Toast.LENGTH_SHORT).show();
            drawer.closeDrawer(GravityCompat.START);
        }
    });

或者

 headerview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // Your code here 
        }
    });

【讨论】:

  • 工作就像一个魅力:)
  • 也为我工作过。!!非常感谢:)
  • 既然这对每个人都有效,我会接受它。
  • 谢谢,萨吉尼! ,你真棒
  • 哇哇,工作就像一个魅力。但是我为社区添加了一些添加以获取导航标题上的特定资源,然后使用 val backArrow = navDrawerID.getHeaderView(0).backDrawerArrowID backArrow.setOnClickListener(this)
【解决方案2】:

不要忘记在 TextView xml 中定义 android:clickable="true"。

【讨论】:

    【解决方案3】:

    我知道这是为那些面临同样问题的人准备的。

    像这样将标题布局放在导航视图中

    这是在activity_main.xml中

    <android.support.design.widget.NavigationView
            android:id="@+id/navigationView"
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:layout_marginTop="-24dp"
            app:itemTextColor="@color/black"
            app:headerLayout="@layout/layout_header_profile"
            app:menu="@menu/nav_menu"/>
    

    创建一个布局,将其命名为 layout_header_profile.xml 并将其填充到您想要的任何视图中。

    layout_header_profile.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="178dp"
        android:orientation="vertical"
        android:weightSum="1"
        >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/id_user_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="16dp"
                android:text="Irfan"
                android:textSize="14sp"
                android:textStyle="bold"
                />
    
            <TextView
                android:id="@+id/id_user_email"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="5dp"
                android:text="Irfan55121@gmail.com"
                android:textSize="14sp"
                android:textStyle="normal"
                />
        </LinearLayout>
        <ImageView
            android:id="@+id/id_profile_image"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="38dp"
            android:src="@mipmap/ic_profile_pic"
            />
        </RelativeLayout>
    

    那么这个标题布局文件将只在你的 activity_main.xml 中

    因此,您可以在 MainActivity.java 中声明它,就像从 activity_main.xml 执行视图并对其执行操作一样,无需特殊代码。

    在你的 onCreate() 中这样做

    TextView tvUserName = (TextView) findViewById(R.id.id_user_name);
    tvUserName.setText("My Name");
       tvUserName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getBaseContext(),"clicking textview",Toast.LENGTH_LONG).show();
            }
        });
    

    希望它工作愉快编码。

    【讨论】:

      【解决方案4】:

      这样试试

          navigationView.getHeaderView(0).setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  // your code here.....
              }
          });
      

      【讨论】:

        【解决方案5】:

        只需将其添加到您的标题布局 Xml 文件中

        android:focusable="true"
        android:focusableInTouchMode="true"
        android:clickable="true"
        

        【讨论】:

          【解决方案6】:

          首先获取标题视图

           View headerView = navigationView.getHeaderView(0);
          

          然后使用onClick监听器

            headerView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
          
                      // code
                  }
              });
          

          【讨论】:

            猜你喜欢
            • 2016-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多