FloatingActionButton的OnClickListener在API 17上无法工作

4

我的FAB在API 17上点击没有反应,但在API 21上正常工作。

我在使用:

compile 'com.android.support:design:23.+'

FAB布局:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/myFAB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_gravity="bottom"
    android:layout_marginBottom="26dp"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    app:backgroundTint="#FFC107"
    android:clickable="true"
    android:elevation="@dimen/design_fab_elevation"
    android:src="@drawable/ic_add_24dp"
    app:borderWidth="0dp" />

关于Activity:

myFAB = (FloatingActionButton) findViewById(R.id.myFAB);
callCadastroEncoemnda();

protected void callCadastroEncoemnda() {
    myFAB.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, newPackage.class);
            MainActivity.this.startActivity(intent);
        }
    });
}

请定义“不工作”的含义。您的应用程序是否崩溃?Logcat 中是否有任何信息?它表现出什么行为?您原本期望它执行什么操作? - MH.
@MH。什么也没有发生,它没有崩溃,在logcat中也没有任何信息,就像我没有点击一样。 - Rafael Mansilha Murta
你尝试过从视图中删除 android:clickable="true" 吗?如果设置了点击监听器,它就不需要了。我在我周围的一个 API 17 设备上进行了快速测试,但对我来说两种方式都可以工作。也就是说:我没有你描述的问题。你能否在 onClick() 回调中设置断点以查看是否触发?newPackage.class 对我来说也有点可疑——它不遵循 Java 命名约定。 - MH.
@MH。我已经删除了android:clickable="true",但仍然是同样的情况。我已经在onClick上设置了断点,但它没有被调用。问题是在API 21+上完美运行,但在API 17上不行。newPackage.class是我创建的一个Activity,在API 21+上完美运行。 - Rafael Mansilha Murta
1个回答

12

问题已解决!

在我的布局中,浮动操作按钮 (FloatingActionButton) 位于一个 RecyclerView 下面,当我点击悬浮操作按钮时,实际上是点击了 RecyclerView(此时 RecyclerView 是空的)。

修改前:

    <android.support.v7.widget.Toolbar
        android:id="@+id/my_awesome_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/primary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/myFAB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_gravity="bottom"
        android:layout_marginBottom="26dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        app:backgroundTint="#FFC107"
        android:clickable="true"
        android:elevation="@dimen/design_fab_elevation"
        android:src="@drawable/ic_add_24dp"
        app:borderWidth="0dp"
        android:layout_alignParentTop="false"
        android:layout_alignParentRight="false"
        android:layout_alignWithParentIfMissing="false"
        android:layout_alignParentLeft="false" />

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/my_awesome_toolbar">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/my_awesome_toolbar"
            android:layout_marginTop="?attr/actionBarSize" />
    </android.support.v4.widget.SwipeRefreshLayout>

之后:

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_awesome_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/primary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipeRefreshLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/my_awesome_toolbar">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/my_awesome_toolbar"
                android:layout_marginTop="?attr/actionBarSize" />
        </android.support.v4.widget.SwipeRefreshLayout>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_gravity="bottom"
            android:layout_marginBottom="26dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            app:backgroundTint="#FFC107"
            android:clickable="true"
            android:elevation="@dimen/design_fab_elevation"
            android:src="@drawable/ic_add_24dp"
            app:borderWidth="0dp"
            android:layout_alignParentTop="false"
            android:layout_alignParentRight="false"
            android:layout_alignWithParentIfMissing="false"
            android:layout_alignParentLeft="false" />
</RelativeLayout>

你说得没错,但我还是不明白。它在所有其他API版本上都能正常工作,但在API 16上却不能。这是怎么回事? - Rana Ranvijay Singh
@Ranvijay,我认为这是一个兼容性问题。我只开发适用于Android API 17+的应用程序,这可以在87%的设备上运行。 - Rafael Mansilha Murta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接