4

新しくリリースされた Android サポート デザイン ライブラリの NavigationView を使用すると、ナビゲーション ヘッダー レイアウトに (xml に) onClick が含まれている場合、onClick イベントによってアプリがクラッシュします。OnClick は (xml ではなく) プログラムで追加できview.onClickListener、クリックすると正常に動作します。しかし、何らかの理由で、xml onClick が使用されるたびにエラーが発生します。

これが私の主なレイアウトです:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mainActivityLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <RelativeLayout
        android:id="@+id/mainContentFrame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        ...

    </RelativeLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/drawerNavView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/drawer_menu">

    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

私のアクティビティでは、メニュー項目のクリック ( で追加navView.setNavigationItemSelectedListener()) が正常に機能します。問題は、ヘッダーがクリックされたときです。

drawer_header.xml:

...

<View
    android:id="@+id/testButton"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:onClick="testButtonClick"/>

...

次のエラーが発生します。

java.lang.IllegalStateException: Could not find a method testButtonClick(View) 
in the activity class android.view.ContextThemeWrapper for onClick handler
on view class android.view.View with id 'testButton'

アップデート

NavigationView は標準のメニュー リソース ファイルを使用できますが、メニュー XML リソースから onClick を使用する場合も同様の問題があります。Menu Resource referenceによると、このandroid:onClick属性は通常のコールバックをオーバーライドします。これは通常は正常に機能しますが、NavigationView のメニュー項目では機能しません。代わりに、次のエラーでクラッシュします。

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}:
android.view.InflateException: Binary XML file line #34: 
Error inflating class android.support.design.widget.NavigationView

XML onClick を削除すると、エラーはなくなります。

アップデート

Android Design Libraryの「公式」デモ プロジェクトを使用して、xml onClick をテストしました。同じ結果: onClick (xml) を NavigationView のメニューまたはヘッダーに追加すると、アプリがクラッシュします。したがって、これは NavigationView のバグのようです。

v23.1 で解決済み

Googleは、サポート ライブラリ v23.1 でこれらの XML onClick エラーの修正をリリースしました。

4

4 に答える 4

2

これはサポート ライブラリのバグです。

どうやら に関連しているようContextThemeWrapperで、このバグ レポートによると、この問題は Support Library 22.1 に存在します。

したがって、短い答えは次のとおりです。

修正されるまで、NavigationView (または EditText などの他のコンポーネント) で XML onClick を使用しないでください。

回避策:

コードでクリック リスナーを設定します。NavigationView の場合は、 を使用しますsetNavigationItemSelectedListener()

更新: このバグは修正されました

Support Library 23.1 で XML onClick を使用できるようになりました (バグ レポート)。アプリで動作することを確認しました。しかし、この特定の onClick エラーは現在修正されていますが、v23.1 の NavView には他の (より新しい) XML の問題があるようです (以下を参照)。

完全を期すために:

XML 経由で NavigationView ヘッダーをインフレートするときに、別の (関連する?) バグがあるようです。app:headerLayoutXML onClick が機能するようになったにもかかわらず、 XML を使用すると 23.1 でエラーが発生します。NavigationView.inflateHeaderView()このインフレの問題により、コードでメソッドを使用する必要があります。この新しいメソッドは 23.1 で追加されましたが、どうやら以前の XML インフレートは壊れているようです (または、app:headerLayout誰にも言わずに非推奨になったのでしょうか?)。詳細はこちら

于 2015-06-05T00:16:35.137 に答える
1

こんにちは:私の解決策は削除です

app:headerLayout="@layout/drawer_header"

以下のように、NavigationView レイアウトから:

<android.support.design.widget.NavigationView
    android:id="@+id/drawerNavView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/drawer_menu">
</android.support.design.widget.NavigationView>

そして、アクティビティまたはビューコントローラーで以下を使用します

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
View headerView= navigationView.inflateHeaderView(R.layout.nav_header);

TextView tvName = (TextView) headerView.findViewById(R.id.id_nav_header_uname);
tvName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        L.d("=======tv click=====");
    }
});

これは私にとってはうまくいきます。

于 2015-10-22T13:48:10.390 に答える
0

XML で言及せずにコードでメソッドを記述できます。コードでは、コードを使用するだけです

public void methodName()
{
//
}

View v = findViewById(R.id.view_id);
v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
methodName();
}
});
于 2015-05-31T02:24:31.783 に答える
-1

NavigationView には、メニュー項目の OnNavigationItemSelectedListener があります。

例えば

navigationView.setNavigationItemSelectedListener(new SelectedNavigationItemListener());

private class SelectedNavigationItemListener implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    public boolean onNavigationItemSelected(MenuItem menuItem) {

        switch (menuItem.getItemId()){
            case id1:
                break;
        }

        Log.d("MENU ITEM", menuItem.getTitle().toString());
        return false;
    }

}

ヘッダーの場合、たとえば次のようなことができます

navigationView = (NavigationView) findViewById(R.id.navigation_view);
View header = navigationView.inflateHeaderView(R.layout.drawer_header);
RelativeLayout drawerHeader = (RelativeLayout) header.findViewById(R.id.drawerHeader);
drawerHeader.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("CLICKED HEADER", "Header Clicked");
    }
});

私の HeaderLayout のリファレンス:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawerHeader"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="12dp">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:textSize="16sp" />

于 2015-06-04T07:18:37.660 に答える