FAQ_07_android:clickable 问题

本文探讨了Android中如何正确设置Button为不可点击状态。通过分析`setClickable(false)`方法和XML属性`android:clickable=false`的效果及限制,给出了正确的实现方案。

在android Button的xml文件属性中有这麽一个属性标签:

android:clickable
该标签(继承自View的xml属性)的值必须是boolean值,即true、false。该标签目的是设置button是否可以被点击。

于是,我Demo一把,xml文件如下:

<Button
    android:id="@+id/btn_to"
    android:clickable="false"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="to"
    />  
不好意思,运行之后,该Button一如既往的好使,并没有“不可点击”。搞不明白、、、、

在 android 中几乎每一个xml属性,对应的都有一个方法,于是我改用下面的方法:

setClickable();
心里想,这次应该可以了,示意代码:

btn_to.setClickable(false);
btn_to.setOnClickListener(new Button.OnClickListener() {

	@Override
	public void onClick(View v) {
	  // to do	
	}
});
再次运行,还是不行!没办法,看源码吧!

我们知道,点击 button 会触发下面的源码(View.java):

public void setOnClickListener(OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        mOnClickListener = l;
    }
呵呵,你会明白,只要点击button都会将setClickable设置为true,所以在setOnClickListener之前setClickable设置为false只不过是多此一举!

那么,解决办法就出来了,调换一下代码的位置即可:

btn_to.setOnClickListener(new Button.OnClickListener() {

	@Override
	public void onClick(View v) {
	    // to do
	}
});
		
btn_to.setClickable(false);

这样,你再次点击button试一试,呵呵,它无动于衷了吧!

yes,搞定!


<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout 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/max_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_blue" tools:context=".MainActivity"> <View android:id="@+id/mask_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" android:alpha="0" /> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingStart="10dp" android:paddingEnd="10dp"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" android:id="@+id/top_bulb_off"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/back_white" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Smart Lamp" android:textSize="18sp" android:textStyle="bold" android:textColor="@color/white" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/home_setting_on" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="center_horizontal" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/location_white" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bedroom" android:textColor="@color/white" android:textSize="14sp" /> </LinearLayout> </LinearLayout> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="visible" android:id="@+id/top_bulb_on"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/home_back" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Smart Lamp" android:textSize="18sp" android:textStyle="bold" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/home_setting" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="center_horizontal" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/location_gray" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bedroom" android:textColor="@color/gray333" android:textSize="14sp" /> </LinearLayout> </LinearLayout> </FrameLayout> <LinearLayout android:id="@+id/button_group" android:layout_width="match_parent" android:layout_height="55dp" android:layout_marginStart="4dp" android:layout_marginTop="30dp" android:gravity="center_vertical" android:orientation="horizontal" android:clipToPadding="false" android:clipChildren="false"> <com.google.android.material.button.MaterialButton android:id="@+id/auto_button" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/white_button" android:gravity="center" android:padding="0dp" android:text="Auto" android:textColor="@color/gray66" android:textSize="8sp" app:backgroundTint="@null" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <com.google.android.material.button.MaterialButton android:id="@+id/white_button" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/white_button_selector" android:gravity="center" android:padding="0dp" app:backgroundTint="@null" app:icon="@drawable/color_edit" app:iconGravity="textEnd" app:iconPadding="0dp" app:iconTint="@color/black" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <com.google.android.material.button.MaterialButton android:id="@+id/orange_button" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/orange_button_selector" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:gravity="center" android:padding="0dp" app:backgroundTint="@null" app:iconGravity="textEnd" app:iconPadding="0dp" app:iconTint="@color/black" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <com.google.android.material.button.MaterialButton android:id="@+id/deepblue_button" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/deepblue_button_selector" android:gravity="center" android:padding="0dp" app:backgroundTint="@null" app:iconGravity="textEnd" app:iconPadding="0dp" app:iconTint="@color/black" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <com.google.android.material.button.MaterialButton android:id="@+id/blue_button" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/blue_button_selector" android:gravity="center" android:padding="0dp" app:backgroundTint="@null" app:iconGravity="textEnd" app:iconPadding="0dp" app:iconTint="@color/black" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <com.google.android.material.button.MaterialButton android:id="@+id/red_button" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/red_button_selector" android:gravity="center" android:padding="0dp" app:backgroundTint="@null" app:iconGravity="textEnd" app:iconPadding="0dp" app:iconTint="@color/black" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.3"/> </LinearLayout> <TextView android:id="@+id/percent_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="15dp" android:text="100%" android:textSize="18sp" /> <TextView android:id="@+id/off" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="15dp" android:text="OFF" android:textColor="@color/white" android:textSize="20sp" /> <FrameLayout android:id="@+id/bulb_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp"> <ImageView android:id="@+id/blub_dark" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:src="@drawable/blub_dark"/> <ImageView android:id="@+id/blub_max_init" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:src="@drawable/bulb_light" /> </FrameLayout> <ImageView android:id="@+id/switch_on" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" android:src="@drawable/switch_on" /> </LinearLayout> </ScrollView> <LinearLayout android:id="@+id/bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxHeight="800dp" android:orientation="vertical" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/pull_up" android:layout_width="match_parent" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:paddingTop="20dp" android:background="@color/white" android:src="@drawable/pull"/> <LinearLayout android:layout_width="match_parent" android:layout_height="800dp" android:background="@color/white" android:orientation="vertical"> <!-- 横向菜单 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_marginBottom="20dp" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Mode" android:textColor="@color/black" android:drawableTop="@drawable/mode"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Schedule" android:textColor="@color/black" android:drawableTop="@drawable/schedule"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Away" android:textColor="@color/black" android:drawableTop="@drawable/away"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Timer" android:textColor="@color/black" android:drawableTop="@drawable/timer"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10dp" android:background="@color/bg_gray"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="34dp" android:paddingTop="20dp" android:paddingBottom="25dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Today" android:textColor="@color/gray_99999" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:orientation="horizontal"> <!-- 第一组 --> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/gray333" android:textStyle="bold" android:text="12.1" android:textSize="23sp"/> <TextView android:layout_marginStart="3dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="@color/gray333" android:text="h"/> </LinearLayout> <!-- 第二组 --> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/gray333" android:textStyle="bold" android:text="125.1" android:textSize="23sp"/> <TextView android:layout_marginStart="3dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="@color/gray333" android:text="Kmh"/> </LinearLayout> <!-- 第三组 --> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/gray333" android:textStyle="bold" android:text="992.3" android:textSize="23sp"/> <TextView android:layout_marginStart="3dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="@color/gray333" android:text="Kmh"/> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Runtime" android:textColor="@color/gray_99999" android:layout_weight="1" android:textSize="14sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Usage" android:textColor="@color/gray_99999" android:layout_weight="1" android:textSize="14sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Saving" android:textColor="@color/gray_99999" android:layout_weight="1" android:textSize="14sp"/> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10dp" android:background="@color/bg_gray"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="18dp" android:layout_marginEnd="18dp" android:layout_marginTop="15dp" android:layout_marginBottom="15dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Favorite" android:textColor="@color/gray333" android:layout_weight="1" android:textStyle="normal"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" android:src="@drawable/favorite_selector"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginStart="15dp" android:background="@color/gray_EB"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="18dp" android:layout_marginEnd="18dp" android:layout_marginTop="15dp" android:layout_marginBottom="15dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Device Sharing" android:textColor="@color/gray333" android:layout_weight="1" android:textStyle="normal"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_shared"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="2dp" android:text="2" android:textColor="#B5BAC4" android:textSize="14sp"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/device_share"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginStart="15dp" android:background="@color/gray_EB"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="18dp" android:layout_marginEnd="18dp" android:layout_marginTop="15dp" android:layout_marginBottom="15dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="FAQ & Feedback" android:textColor="@color/gray333" android:layout_weight="1" android:textStyle="normal"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/device_share"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginStart="15dp" android:background="@color/gray_EB"/> </LinearLayout> </LinearLayout> </androidx.core.widget.NestedScrollView> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> 这是我总的xml,bulbImage支持滑动操作,但是横屏的时候这个滑动操作会被认为成scrollview的滑动,其次因为下面有一个buttonbevior,横屏的时候下面那个button都不显示,滑动到底也没有,这两个问题如何解决
08-22
<fragment android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" />如果放在<!--隐藏bottomsheet--> <LinearLayout android:id="@+id/ll_bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" app:behavior_peekHeight="105dp" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:id="@+id/pull" android:layout_width="match_parent" android:layout_height="30dp" android:background="@color/white" android:clickable="false" android:focusable="false" android:gravity="center" android:paddingTop="15dp" android:src="@drawable/pullselector" /> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:layout_gravity="center_horizontal" android:background="@color/white" android:paddingStart="10dp" android:paddingTop="10dp" android:paddingEnd="10dp" android:weightSum="4"> <ImageButton android:id="@+id/button_mode" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/mode" /> <ImageButton android:id="@+id/button_schedule" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/schedule" /> <ImageButton android:id="@+id/button_away" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/away" /> <ImageButton android:id="@+id/button_timer" android:layout_width="0dp" android:layout_height="60dp" android:layout_weight="1" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/timer" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="42dp" android:layout_gravity="center_horizontal" android:background="@color/white" android:paddingStart="10dp" android:paddingEnd="10dp" android:weightSum="4"> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Mode" /> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Schedule" /> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Away" /> <TextView android:layout_width="0dp" android:layout_height="42dp" android:layout_weight="1" android:gravity="center" android:text="Timer" /> </LinearLayout> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="10.5dp" android:background="@color/background_gray" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <TextView android:layout_width="113dp" android:layout_height="41dp" android:gravity="center" android:text="Today" android:textColor="@color/text_gray" android:textSize="13dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="70dp" android:background="@color/white" android:paddingStart="35dp" android:paddingEnd="35dp" android:weightSum="3"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="12.1" android:textSize="23dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_weight="1" android:text="h" android:textSize="12dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:text="Runtime" android:textColor="@color/text_gray" android:textSize="14dp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="125.1" android:textSize="23dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_weight="1" android:text="Kmh" android:textSize="12dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:text="Usage" android:textColor="@color/text_gray" android:textSize="14dp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="11dp" android:layout_weight="1" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="992.3" android:textSize="23dp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_weight="1" android:text="Kmh" android:textSize="12dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:text="Saving" android:textColor="@color/text_gray" android:textSize="14dp" /> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10.5dp" android:background="@color/background_gray" /> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/white" android:gravity="center_vertical" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Favorite" android:textSize="16dp" /> <!-- 占位 View,用来推动 ImageButton 到右边 --> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <ImageButton android:id="@+id/button_favorite" android:layout_width="42dp" android:layout_height="28dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/favorite_on" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <View android:layout_width="320dp" android:layout_height="0.2dp" android:layout_gravity="center_horizontal" android:background="@color/text_gray" /> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/white" android:gravity="center_vertical" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Device Sharing" android:textSize="16dp" /> <!-- 占位 View,用来推动 ImageButton 到右边 --> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <ImageView android:layout_width="16dp" android:layout_height="16dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/sharing" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2" android:textColor="@color/text_gray" /> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/more" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <View android:layout_width="320dp" android:layout_height="0.2dp" android:layout_gravity="center_horizontal" android:background="@color/text_gray" /> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/white" android:gravity="center_vertical" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="FAQ & Feedback" android:textSize="16dp" /> <!-- 占位 View,用来推动 ImageButton 到右边 --> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/more" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <View android:layout_width="320dp" android:layout_height="0.2dp" android:layout_gravity="center_horizontal" android:background="@color/text_gray" /> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="280dp" android:background="@color/white" /> </LinearLayout> </ScrollView> </LinearLayout> </LinearLayout>下面会被遮挡,如果放在上面则会影响bottomsheet正常滑动,怎么解决
最新发布
08-27
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/dialog_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="@dimen/dimen_84dp" android:orientation="vertical"> <com.google.android.material.appbar.COUIDividerAppBarLayout android:id="@+id/appbar" style="@style/CommonAppBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/color_transparent" android:clickable="true" android:focusable="true" android:paddingLeft="@dimen/dimen_0dp" android:paddingRight="@dimen/dimen_0dp" app:elevation="@dimen/toolbar_elevation"> <com.coui.appcompat.toolbar.COUIToolbar android:id="@+id/toolbar" style="@style/COUIToolBarInAppBarLayoutStyle" android:layout_width="match_parent" android:background="@null" app:supportTitleTextAppearance="@style/textAppearanceSecondTitle" app:titleCenter="false" /> <com.coui.appcompat.tablayout.COUITabLayout android:id="@+id/tab_layout" android:background="@color/color_transparent" style="@style/COUISmallTabLayoutStyle" /> </com.google.android.material.appbar.COUIDividerAppBarLayout> <RelativeLayout android:id="@+id/content_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <com.filemanager.common.view.ViewPagerWrapperForPC android:id="@+id/view_pager_wrapper" android:layout_width="match_parent" android:layout_height="match_parent"> <com.filemanager.common.view.viewpager.RTLViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/appbar" android:clipChildren="false" android:clipToPadding="false" android:orientation="horizontal" /> </com.filemanager.common.view.ViewPagerWrapperForPC> </RelativeLayout> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="?attr/couiColorBackgroundElevatedWithCard" android:minHeight="@dimen/operation_btn_background_height"> <View android:id="@+id/button_divider" android:layout_width="match_parent" android:layout_height="@dimen/divider_background_height" android:layout_gravity="top" android:alpha="0" android:background="?attr/couiColorDivider" android:forceDarkAllowed="false" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <LinearLayout android:id="@+id/select_root_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="@dimen/dimen_16dp" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:orientation="horizontal"> <TextView android:id="@+id/select_title_content" android:layout_width="match_parent" android:layout_height="match_parent" android:lineHeight="22dp" android:text="@string/not_selected_file" android:textAppearance="@style/couiTextHeadlineXS" android:textColor="?attr/couiColorLabelPrimary" android:textSize="16sp" android:visibility="visible" /> <ImageView android:id="@+id/select_arraw_up" android:layout_width="18dp" android:layout_height="18dp" android:src="@drawable/arrow_up" android:layout_marginLeft="@dimen/dimen_6dp" android:visibility="gone" android:layout_gravity="center"/> </LinearLayout> <TextView android:id="@+id/select_body_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:lineHeight="20dp" android:textSize="14sp" android:textAppearance="?attr/couiTextBodyXS" android:textColor="?attr/couiColorLabelSecondary" android:visibility="gone" android:text="@string/selected_size"/> </LinearLayout> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1"/> <com.coui.appcompat.button.COUIButton android:id="@+id/btn_add_file" style="@style/Widget.COUI.Button.Large" android:layout_width="@dimen/dimen_96dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginEnd="@dimen/dimen_16dp" android:text="@string/label_add_recent_file" /> </LinearLayout> </FrameLayout> </FrameLayout>这是这个页面
07-29
<think>我们有一个布局文件,其中底部有一个操作栏,包含左侧的文本信息和右侧的按钮。在简体中文下,当系统字体设置为最大时,布局正常。但在维吾尔语(RTL语言)下,右侧的文本(实际上在RTL下会显示在左侧)可能会将按钮挤到屏幕边缘。 问题分析: 在RTL布局下,原本在左侧的文本会变成在右侧,而原本在右侧的按钮会变成在左侧。但是,由于文本长度可能因语言不同而变化(例如维吾尔语的文本可能更长),导致文本占据更多空间,从而挤压按钮的空间,甚至将按钮挤出屏幕。 解决方案: 1. 使用ConstraintLayout替代底部的FrameLayout和LinearLayout,以便更好地控制元素的位置和约束。 2. 为文本区域设置约束,使其左侧(在LTR中)或右侧(在RTL中)与父布局对齐,右侧(在LTR中)或左侧(在RTL中)与按钮对齐,并设置文本区域的最大宽度,避免挤压按钮空间。 3. 使用start和end替代left和right,确保在RTL布局下自动调整。 4. 为文本设置ellipsize和maxLines,防止文本过长。 5. 确保按钮有固定的宽度或最小宽度,并且文本区域不会挤压按钮。 由于原布局较为复杂,我们重点修改底部操作栏部分(即最底部的FrameLayout)。我们将底部操作栏的布局改为ConstraintLayout,并设置文本和按钮之间的约束关系。 修改后的底部操作栏布局: 注意:为了不影响原有布局的其他部分,我们只修改底部操作栏(即最后一个FrameLayout)内部的LinearLayout为ConstraintLayout,并设置约束。 具体修改步骤: 1. 将底部操作栏中的LinearLayout替换为ConstraintLayout。 2. 将原来的两个子元素(左侧的LinearLayout和右侧的COUIButton)放入ConstraintLayout中。 3. 设置左侧文本区域的约束:左侧与父布局的start对齐,右侧与按钮的start对齐(在RTL下会自动调整方向),并设置右侧的按钮的约束:右侧与父布局的end对齐。 4. 设置文本区域的最大宽度,并设置文本省略方式。 修改后的代码(仅底部操作栏部分): ```xml <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="?attr/couiColorBackgroundElevatedWithCard" android:minHeight="@dimen/operation_btn_background_height"> <View android:id="@+id/button_divider" android:layout_width="match_parent" android:layout_height="@dimen/divider_background_height" android:layout_gravity="top" android:alpha="0" android:background="?attr/couiColorDivider" android:forceDarkAllowed="false" /> <!-- 将LinearLayout改为ConstraintLayout --> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <!-- 左侧的文本区域,原id为select_root_view --> <LinearLayout android:id="@+id/select_root_view" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dimen_16dp" android:layout_marginEnd="@dimen/dimen_16dp" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/btn_add_file" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <!-- 内部布局保持不变 --> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:orientation="horizontal"> <TextView android:id="@+id/select_title_content" android:layout_width="wrap_content" android:layout_height="match_parent" android:lineHeight="22dp" android:text="@string/not_selected_file" android:textAppearance="@style/couiTextHeadlineXS" android:textColor="?attr/couiColorLabelPrimary" android:textSize="16sp" android:visibility="visible" android:maxLines="1" android:ellipsize="end" /> <ImageView android:id="@+id/select_arraw_up" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="center" android:layout_marginLeft="@dimen/dimen_6dp" android:src="@drawable/arrow_up" android:visibility="gone" /> </LinearLayout> <TextView android:id="@+id/select_body_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:lineHeight="20dp" android:text="@string/selected_size" android:textAppearance="?attr/couiTextBodyXS" android:textColor="?attr/couiColorLabelSecondary" android:textSize="14sp" android:visibility="gone" /> </LinearLayout> <!-- 右侧的按钮 --> <com.coui.appcompat.button.COUIButton android:id="@+id/btn_add_file" style="@style/Widget.COUI.Button.Large" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/dimen_16dp" android:minWidth="@dimen/dimen_96dp" android:text="@string/label_add_recent_file" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout> ``` 修改说明: 1. 将底部操作栏中的LinearLayout替换为ConstraintLayout,并设置宽高为match_parent。 2. 左侧文本区域(select_root_view)的宽度设置为0dp,使其在约束中自适应,约束为:左侧与父布局start对齐,右侧与按钮的start对齐(这样在LTR中,文本区域在左,按钮在右;在RTL中,按钮在左,文本区域在右)。 3. 按钮(btn_add_file)约束在父布局的end,并设置最小宽度(minWidth)为96dp,确保按钮不会被挤压变形。 4. 在文本区域的TextView(select_title_content)中,添加了`android:maxLines="1"`和`android:ellipsize="end"`,确保文本过长时显示省略号,避免挤压按钮空间。 5. 注意:在RTL布局下,原本在右侧的按钮会移动到左侧,而文本区域会移动到右侧,但约束关系保持不变(即文本区域总是在按钮的相反方向,并且不会挤压按钮的空间,因为文本区域被约束在按钮和父布局之间)。 这样修改后,无论文本内容多长,文本区域都会在到达按钮边缘时自动省略,而按钮始终固定在父布局的end(RTL下为左侧)并保持足够的宽度。 另外,为了确保整个布局在RTL语言下的正确性,请确保在AndroidManifest.xml中声明支持RTL: ```xml <application ... android:supportsRtl="true"> </application> ``` 如果仍有问题,可以考虑为文本区域设置最大宽度(比如使用layout_constraintWidth_max属性),但上述约束已经可以避免挤压按钮。 注意:由于原布局中使用了自定义组件和特定样式,修改时请确保样式和尺寸资源正确。 如果还有其他问题,请提供具体的错误现象或截图,以便进一步调整。 §§相关问题§§: 1. 在ConstraintLayout中,如何设置一个View的最大宽度? 2. 如何为不同的语言(如阿拉伯语)提供不同的布局文件? 3. 在RTL布局下,如何手动测试布局效果? 4. 在Android中,如何动态改变布局方向(例如从LTR切换到RTL)?</think>### 解决底部操作栏在 RTL 语言下的布局问题 您提供的布局在维吾尔语(RTL 语言)下会出现右侧文本挤压按钮的问题。以下是完整的解决方案,重点修改底部操作栏部分: #### 修改后的底部操作栏布局(核心部分) ```xml <!-- 底部操作栏 --> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="?attr/couiColorBackgroundElevatedWithCard" android:minHeight="@dimen/operation_btn_background_height"> <View ... /> <!-- 保留原有分割线 --> <!-- 改为ConstraintLayout解决RTL挤压问题 --> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingVertical="@dimen/dimen_8dp"> <!-- 添加垂直内边距 --> <!-- 左侧文本区域 --> <LinearLayout android:id="@+id/select_root_view" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/btn_add_file" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="@dimen/dimen_16dp" android:layout_marginEnd="@dimen/dimen_8dp" android:orientation="vertical"> <!-- 标题行 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical"> <TextView android:id="@+id/select_title_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" <!-- 关键:权重分配空间 --> android:maxLines="1" <!-- 限制单行 --> android:ellipsize="end" <!-- 超出显示省略号 --> android:textAppearance="@style/couiTextHeadlineXS" android:textColor="?attr/couiColorLabelPrimary" android:textSize="16sp" android:includeFontPadding="false" <!-- 消除字体额外内边距 --> tools:text="长文本测试长文本测试长文本测试" /> <ImageView ... /> <!-- 保留箭头图标 --> </LinearLayout> <TextView ... /> <!-- 保留副标题 --> </LinearLayout> <!-- 右侧按钮 --> <com.coui.appcompat.button.COUIButton android:id="@+id/btn_add_file" style="@style/Widget.COUI.Button.Large" android:layout_width="wrap_content" android:layout_height="wrap_content" android:minWidth="@dimen/dimen_96dp" <!-- 保证最小宽度 --> android:layout_marginEnd="@dimen/dimen_16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" android:text="@string/label_add_recent_file" /> </androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout> ``` ### 关键修改点说明 1. **布局结构重构** - 将 `LinearLayout` 替换为 `ConstraintLayout` - 使用约束关系替代 `layout_weight` + `Space` 的权重组 - 添加垂直内边距防止内容紧贴边缘 2. **文本区域防挤压策略** ```xml android:layout_width="0dp" <!-- 匹配约束宽度 --> app:layout_constraintEnd_toStartOf="@id/btn_add_file" <!-- 绑定按钮边界 --> android:layout_weight="1" <!-- 在内部LinearLayout中分配空间 --> android:maxLines="1" <!-- 强制单行显示 --> android:ellipsize="end" <!-- 超出部分显示... --> android:includeFontPadding="false" <!-- 消除字体额外内边距 --> ``` 3. **按钮保护措施** ```xml android:minWidth="@dimen/dimen_96dp" <!-- 保证最小宽度 --> app:layout_constraintEnd_toEndOf="parent" <!-- 固定在右侧 --> ``` 4. **RTL 语言专用调整(res/layout-ldrtl/)** 创建 `res/layout-ldrtl` 目录下的同名布局文件: ```xml <!-- 针对RTL语言增加文本区域空间 --> <LinearLayout android:id="@+id/select_root_view" ... app:layout_constraintHorizontal_bias="0.3" <!-- 增加左侧空间 --> android:layout_marginEnd="@dimen/dimen_24dp"> <!-- 增大右边距 --> ``` 5. **动态调整代码(可选)** 在 Activity 中检测语言变化: ```java // 检查是否是RTL语言 boolean isRtl = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL; View selectRoot = findViewById(R.id.select_root_view); ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) selectRoot.getLayoutParams(); if (isRtl) { // 维吾尔语下增加右侧空间 params.horizontalBias = 0.3f; params.setMarginEnd(resources.getDimensionPixelSize(R.dimen.dimen_24dp)); } else { params.horizontalBias = 0f; params.setMarginEnd(resources.getDimensionPixelSize(R.dimen.dimen_8dp)); } selectRoot.setLayoutParams(params); ``` ### 完整解决方案步骤 1. **布局结构调整** - 使用 ConstraintLayout 替代 LinearLayout - 设置明确的约束关系(文本↔按钮↔父容器) 2. **空间分配策略** - 文本区域:宽度随约束变化 + 最大宽度限制 - 按钮区域:固定最小宽度 + 右侧固定位置 3. **防溢出措施** - `maxLines="1"` + `ellipsize="end"` - `includeFontPadding="false"` 消除字体额外空间 4. **RTL 专用优化** - 创建 `layout-ldrtl` 目录单独调整 - 增加文本区域可用空间 5. **代码级保护** - 检测语言方向动态调整布局参数 - 设置最小宽度防止文本挤压 > **注意**:测试时使用真实维吾尔语长文本:"ئۇيغۇرچە ئۇزۇن تېكىست سىناق ئۈچۈن"(维吾尔语长文本测试)
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值