首页 > 解决方案 > 如何在此 Framelayout 上添加 onclickListener?

问题描述

这是我的主要活动:

public class MainActivity extends AppCompatActivity {
private LinearLayout mStatusBarAllContents;
private FrameLayout mStatusBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mStatusBar = findViewById(R.id.status_bar);
    mStatusBarAllContents = findViewById(R.id.status_bar_all_contents);
    mStatusBar.setOnClickListener(v -> {
        Log.d("TAG", "status");
    });

    mStatusBarAllContents.setOnClickListener(v -> {
        Log.d("TAG", "statusall");
    });
}

我的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/status_bar"
android:layout_width="match_parent"
android:layout_height="60px"
android:background="@drawable/sysheader_bg"
android:descendantFocusability="afterDescendants"
android:orientation="vertical">

<ImageView
    android:id="@+id/notification_lights_out"
    android:layout_width="22dip"
    android:layout_height="match_parent"
    android:paddingStart="6dp"
    android:paddingBottom="2dip"
    android:scaleType="center"
    android:visibility="gone"
    tools:ignore="RtlCompat" />

<LinearLayout
    android:id="@+id/status_bar_all_contents"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <FrameLayout
        android:layout_width="174px"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/clock_relativelayout"
            android:layout_width="174px"
            android:layout_height="match_parent"
            android:clickable="true"
            android:visibility="visible">

            <TextView
                android:id="@+id/clock_hour"
                android:layout_width="60px"
                android:layout_height="54px"
                android:gravity="center"
                android:includeFontPadding="false"
                android:text="05"
                android:textColor="@color/white"
                android:textSize="52px"
                android:textStyle="bold" />

            <ImageView
                android:id="@+id/clock_coron"
                android:layout_width="12px"
                android:layout_height="48px"
                android:layout_marginTop="9px"
                android:layout_toRightOf="@+id/clock_hour"
                android:scaleType="fitCenter"
                android:src="@drawable/num_12x48_colon" />

            <TextView
                android:layout_width="60px"
                android:layout_height="54px"
                android:layout_toRightOf="@+id/clock_coron"
                android:gravity="center"
                android:includeFontPadding="false"
                android:text="30"
                android:textColor="@color/white"
                android:textSize="52px"
                android:textStyle="bold">
            </TextView>
        </RelativeLayout>           
    </FrameLayout>
    <LinearLayout
        android:id="@+id/status_bar_info_layout"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true"
        android:visibility="visible">

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

            <LinearLayout
                android:id="@+id/audio_area"
                android:layout_width="786px"
                android:layout_height="match_parent"
                android:background="@drawable/da_header_sections_background_click_over_info"
                android:clickable="true"
                android:orientation="horizontal"
                android:splitMotionEvents="false">

                <FrameLayout
                    android:id="@+id/audio_info_area"
                    android:layout_width="708px"
                    android:layout_height="match_parent"
                    android:clickable="false">

                    <TextView
                        android:id="@+id/audio_info"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:layout_marginStart="18px"
                        android:layout_marginLeft="18px"
                        android:ellipsize="end"
                        android:gravity="left"
                        android:singleLine="true"
                        android:text="ALOLO"
                        android:textSize="20sp"
                        android:visibility="visible" />

                    <LinearLayout
                        android:id="@+id/audio_off"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:paddingStart="24px"
                        android:paddingLeft="24px"
                        android:paddingEnd="56px"
                        android:paddingRight="56px"
                        android:visibility="gone">

                        <TextView
                            android:id="@+id/audio_off_text"
                            android:layout_width="648px"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center_vertical"
                            android:layout_marginStart="6px"
                            android:layout_marginLeft="6px"
                            android:ellipsize="end"
                            android:gravity="left"
                            android:singleLine="true"
                            android:text="PowerOFF"
                            android:textColor="@color/white"
                            android:textSize="30px">
                        </TextView>
                    </LinearLayout>
                </FrameLayout>
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>   
</LinearLayout>

我在 FrameLayout 和 LinearLayout 上设置了 onclick,我想显示日志,status但是当我触摸它时,什么也没有发生。然后,我设置 android:layout_width="1dp", android:layout_height="1dp" of id: status_bar_all_contents,它显示 log: status,但 status_bar_all_contents 会消失,所以我不想要那个。那么当我触摸它并显示日志时如何修复status?Ps:对不起,我的英文不好。

标签: javaandroid

解决方案


布局通常会将点击传递给其子级。您可以在此处尝试此解决方案,禁用所有子 onclicks 并启用 FrameLaoyuts onclicks。但我认为这不适用于LinearLayout。

Android框架布局点击监听器不起作用

我的建议将整个视图包装在 aConstraintLayout和 position 2 basic <View>s

一个<View>被约束以匹配FrameLayout

一个<View>被约束以匹配LinearLayout

这些<View>s 将充当叠加层。

       <View
        android:id="@+id/status_bar_overlay"
        app:layout_constraintEnd_toEndOf="@id/status_bar"
        app:layout_constraintStart_toStartOf="@id/status_bar"
        app:layout_constraintTop_toTopOf="@id/status_bar" 
        app:layout_constraintBottom_toBottomOf="@id/status_bar" />

       <View
        android:id="@+id/status_bar_all_contents_overlay"
        app:layout_constraintEnd_toEndOf="@id/status_bar_all_contents"
        app:layout_constraintStart_toStartOf="@id/status_bar_all_contents"
        app:layout_constraintTop_toTopOf="@id/status_bar_all_contents" 
        app:layout_constraintBottom_toBottomOf="@id/status_bar_all_contents" />

设置两个视图onClickListenerActivity然后就可以了。


推荐阅读