Android LinearLayout horizontal 添加分割线不显示 解决方案

本文介绍了解决Android中LinearLayout使用horizontal方向时分割线不显示的问题。通过修改shape文件中的size标签,增加width属性为1px,成功实现了分割线的正确显示。

Android LinearLayout horizontal 添加分割线不显示 解决方案

Android 踩过的那些坑 ,我们在设置LinearLayout 分割线时 发现android:orientation="horizontal"时 分割线显示不出来 

原因就是shape文件属性的问题

不显示的shape 文件写法是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/fengexian" />
    <size android:height="1px"/>
</shape>

正确的写法:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/fengexian" />
    <size android:height="1px" android:width="1px" />
</shape>

那么你也明确了我HomeFragment的搜索框跟SearchResultActivity内部的搜索框之间的关系,其实HomeFragment搜索按钮是控制了SearchResultActivity的搜索按钮,本身HomeFragment的搜索按钮并没有搜索功能,他是传数据给SearchResultActivity并模拟点击SearchResultActivity的搜索按钮,所以如果SearchResultActivity的搜索框要添加一个切换类型的话,在HomeFragment的搜索框也应该同步添加,并且把类型一起传到SearchResultActivity去。当然唯一足就是HomeFragment搜索框弹出提示的逻辑跟SearchResultActivity一致,其实我也在想能能做到让HomeFragment搜索框弹出提示的逻辑做成跟SearchResultActivity一模一样,这样用户看到的提示内容就可以统一,体验感会更好。还有就是,刚刚忽略了xml文件没提供给你。首先fragment_home.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.home.HomeFragment" android:fitsSystemWindows="true" android:layout_marginTop="?attr/actionBarSize"> <!-- 🔵 垂直指南线:5%、50%、95% --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_05" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.05" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_50" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.50" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_95" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.95" /> <!-- 🔍 输入框 --> <AutoCompleteTextView android:id="@+id/home_input" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="请输入需要查询的公交线路或站点" android:textColorHint="#777777" android:completionThreshold="1" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:minHeight="48dp" android:textSize="14sp" android:padding="12dp" android:singleLine="true" android:imeOptions="actionSearch" app:layout_constraintTop_toTopOf="@id/guideline_05" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/home_search" app:layout_constraintHorizontal_chainStyle="packed" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" /> <!-- 🔎 搜索按钮 --> <Button android:id="@+id/home_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" app:layout_constraintTop_toTopOf="@id/home_input" app:layout_constraintBottom_toBottomOf="@id/home_input" app:layout_constraintStart_toEndOf="@id/home_input" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" /> <!-- 🚌 图片:居中偏上 --> <ImageView android:id="@+id/image_bus" android:layout_width="0dp" android:layout_height="wrap_content" android:src="@drawable/bus" app:layout_constraintTop_toTopOf="@id/guideline_50" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintWidth_percent="0.6" android:scaleType="fitCenter" /> <!-- ℹ️ 底部说明文字 --> <TextView android:id="@+id/text_home" android:textColor="#777777" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintTop_toTopOf="@id/guideline_95" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> 其次activity_search_result.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_marginTop="?attr/actionBarSize"> <!-- ====== 指南线:用于精确百分比定位 ====== --> <!-- 地图底部 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_60" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.60" /> <!-- 结果列表顶部留白结束位置 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_65" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.65" /> <!-- 按钮顶部位置 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_90" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.90" /> <!-- 🔍 输入框 --> <AutoCompleteTextView android:id="@+id/search_input" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="请输入需要查询的公交线路或站点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:minHeight="48dp" android:textSize="14sp" android:padding="12dp" android:singleLine="true" android:imeOptions="actionSearch" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/search_btn" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" /> <!-- 🔎 搜索按钮 --> <Button android:id="@+id/search_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toEndOf="@id/search_input" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" /> <!-- 🗺️ 地图视图 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginTop="20dp" app:layout_constraintTop_toBottomOf="@id/search_input" app:layout_constraintBottom_toTopOf="@id/guideline_60" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <!-- 🔲 固定高度容器:包裹 RecyclerView --> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/container_result_list" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintTop_toTopOf="@id/guideline_65" app:layout_constraintBottom_toTopOf="@id/guideline_90" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginHorizontal="16dp"> <!-- 🔽 RecyclerView:内部可滚动 --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/result_list" android:layout_width="0dp" android:layout_height="0dp" android:nestedScrollingEnabled="false" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:scrollbars="vertical" android:scrollbarThumbVertical="@drawable/custom_scrollbar_thumb" android:scrollbarTrackVertical="@drawable/custom_scrollbar_track"/> <!-- 空状态提示 --> <TextView android:id="@+id/empty_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂无搜索结果" android:visibility="gone" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <!-- “到这去”按钮 --> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_margin="16dp" app:layout_constraintTop_toTopOf="@id/guideline_90" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"> <Button android:id="@+id/btn_toggle_mode" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginEnd="8dp" android:text="📍 附近" android:textSize="14sp" android:padding="6dp" /> <Button android:id="@+id/btn_go_to" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginStart="8dp" android:text="到这去" android:textSize="14sp" /> </LinearLayout> <!-- 🌀 加载进度条 --> <ProgressBar android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:elevation="10dp" /> </androidx.constraintlayout.widget.ConstraintLayout> 还有fragment_map.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.map.MapFragment" android:fitsSystemWindows="true" android:layout_marginTop="?attr/actionBarSize"> <!-- 🔹 起点输入框 --> <AutoCompleteTextView android:id="@+id/map_input1" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入起点" android:textColorHint="#777777" android:textColor="@color/black" android:textSize="14sp" android:background="@drawable/rounded_edittext" android:padding="12dp" android:singleLine="true" android:imeOptions="actionSearch" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" /> <!-- 🔹 终点输入框 --> <AutoCompleteTextView android:id="@+id/map_input2" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入终点" android:textColorHint="#777777" android:textColor="@color/black" android:textSize="14sp" android:background="@drawable/rounded_edittext" android:padding="12dp" android:singleLine="true" android:imeOptions="actionSearch" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toBottomOf="@id/map_input1" app:layout_constraintVertical_bias="0" /> <!-- 分割线:75% 处 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.75" /> <!-- 🔍 搜索按钮 --> <Button android:id="@+id/map_search" android:layout_width="0dp" android:layout_height="0dp" android:text="搜索" android:textSize="16sp" app:layout_constraintStart_toStartOf="@id/guideline_search" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/map_input1" app:layout_constraintBottom_toBottomOf="@id/map_input2" android:layout_marginEnd="16dp" /> <!-- 🗺️ 地图视图:✅ 改为默认到底部 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/map_input2" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="4dp" /> <!-- ====== 指南线:用于精确百分比定位 ====== --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_60" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.60" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_90" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.90" /> <!-- 🔲 固定容器包裹列表 --> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/container_result_list" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintTop_toTopOf="@id/guideline_60" app:layout_constraintBottom_toTopOf="@id/guideline_90" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginHorizontal="16dp" android:visibility="gone"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/result_list" android:layout_width="0dp" android:layout_height="0dp" android:nestedScrollingEnabled="false" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:scrollbars="vertical" android:scrollbarThumbVertical="@drawable/custom_scrollbar_thumb" android:scrollbarTrackVertical="@drawable/custom_scrollbar_track" /> <TextView android:id="@+id/empty_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="👉 请点击选择起点" android:textColor="#007AFF" android:textSize="16sp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <!-- 按钮组 --> <LinearLayout android:id="@+id/button_group" android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_margin="16dp" app:layout_constraintTop_toBottomOf="@id/container_result_list" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:visibility="gone" android:gravity="center_vertical"> <Button android:id="@+id/btn_switch_target" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="选择终点" android:textSize="14sp" /> <Button android:id="@+id/btn_toggle_mode" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginStart="8dp" android:text="📍 附近" android:textSize="14sp" android:padding="6dp" /> <Button android:id="@+id/btn_go_to" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginStart="8dp" android:text="规划路线" android:textSize="14sp" android:enabled="false" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> 这回你应该对我整个项目框架有了更进一步的了解了
最新发布
12-10
<!-- 底部操作栏修改后代码 --> <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" ... /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center_vertical"> <!-- 修复1:约束左侧容器宽度 --> <LinearLayout android:id="@+id/select_root_view" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" <!-- 关键修改 --> android:orientation="vertical" android:layout_marginStart="@dimen/dimen_16dp" android:minWidth="60dp"> <!-- 防止极端情况 --> <!-- 修复2:防止文本溢出 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <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" <!-- 文本溢出显示省略号 --> ... /> <ImageView android:id="@+id/select_arraw_up" ... /> </LinearLayout> <!-- 修复3:次级文本同样约束 --> <TextView android:id="@+id/select_body_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" ... /> </LinearLayout> <!-- 修复4:按钮设置固定外边距 --> <com.coui.appcompat.button.COUIButton android:id="@+id/btn_add_file" android:layout_width="wrap_content" android:layout_height="wrap_content" android:minWidth="@dimen/dimen_96dp" <!-- 保证最小宽度 --> android:layout_marginStart="@dimen/dimen_16dp" <!-- 新增间隔 --> android:layout_marginEnd="@dimen/dimen_16dp" ... /> </LinearLayout> </FrameLayout>
07-29
<think>好的,我需要回答用户关于如何在Android中实现自定义样式的下拉选择框并支持多列显示的问题。首先,我需要回忆Android中常用的下拉控件。通常,Spinner是常用的下拉选择组件,但默认的Spinner支持多列显示。因此,可能需要自定义Spinner的布局或者使用其他更灵活的控件。 接下来,我应该考虑如何实现多列布局。一个常见的方法是使用PopupWindow或Dialog来创建一个自定义的弹出视图,其中可以包含多列,比如使用GridView或者RecyclerView来布局多列内容。这样用户点击Spinner时,弹出一个自定义的对话框,里面显示多列的数据。 然后,我需要考虑如何自定义下拉项的样式。这涉及到创建自定义的Adapter,并覆盖getView方法,以便为每个下拉项提供自定义的布局文件。可能需要使用XML布局文件来定义每一行的多列结构,比如使用LinearLayout水平排列多个TextView,或者使用GridLayout来管理多列。 另外,数据绑定部分也很重要。用户的数据需要适配到多列布局中,可能需要将数据拆分成多个列,并在Adapter中正确处理数据的显示。例如,如果数据是一个对象列表,每个对象有多个属性,每个属性对应一列,那么Adapter需要将这些属性分别绑定到对应的视图上。 还需要处理用户的选择事件。当用户点击某一项时,需要获取对应的数据,并更新Spinner的显示内容。如果是多列选择,可能需要考虑是单选还是多选,但用户的问题中未明确说明,可能需要假设是单选,但界面显示多列信息。 此外,样式自定义可能包括修改弹出框的背景、边框、字体颜色、间距等。可能需要定义自定义的样式资源,并在Java代码中动态设置这些样式,或者在XML布局文件中预先定义。 可能的挑战包括正确处理弹出窗口的位置和大小,确保多列布局在同屏幕尺寸上的适配,以及保持流畅的用户体验。可能需要测试同的布局管理器,比如GridLayoutManager配合RecyclerView,或者使用GridView来展示多列数据。 最后,整合所有部分:自定义Spinner的适配器、多列布局的弹出窗口、数据绑定和事件处理。同时,参考现有的开源库或文档中的实现方法,比如检查是否有类似的组件在React Native或其他库中存在,但用户需要的是Android原生实现,所以可能需要参考Android官方文档或社区解决方案。 需要确保提供的代码示例正确无误,并解释关键步骤,比如自定义Adapter、布局文件和弹出窗口的处理。同时,提醒用户可能的注意事项,比如性能优化或兼容性问题。</think>在Android中实现自定义样式的下拉选择框并支持多列显示,可以通过以下步骤完成: --- ### 1. 自定义Spinner布局 **核心思路**:使用`Spinner`控件,但通过自定义布局和适配器实现多列显示。 **实现步骤**: 1. **创建多列布局文件** 在`res/layout`目录下新建`multi_column_spinner_item.xml`,使用`LinearLayout`横向排列多个列: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/column1" android:layout_width="0dp" android:layout_weight="1" android:padding="8dp"/> <TextView android:id="@+id/column2" android:layout_width="0dp" android:layout_weight="1" android:padding="8dp"/> </LinearLayout> ``` 2. **自定义适配器** 继承`BaseAdapter`并重写`getView`方法: ```java public class MultiColumnAdapter extends BaseAdapter { private List<DataModel> data; private LayoutInflater inflater; public MultiColumnAdapter(Context context, List<DataModel> data) { this.data = data; inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.multi_column_spinner_item, parent, false); } DataModel item = data.get(position); TextView column1 = convertView.findViewById(R.id.column1); TextView column2 = convertView.findViewById(R.id.column2); column1.setText(item.getColumn1()); column2.setText(item.getColumn2()); return convertView; } // 其他必要方法:getCount(), getItem(), getItemId() } ``` --- ### 2. 实现弹出窗口多列显示 **替代方案**:若需要更复杂的交互,可用`RecyclerView`+`PopupWindow`实现多列列表。 **关键代码片段**: ```java Spinner spinner = findViewById(R.id.spinner); spinner.setOnClickListener(v -> { PopupWindow popup = new PopupWindow(context); RecyclerView recyclerView = new RecyclerView(context); recyclerView.setLayoutManager(new GridLayoutManager(context, 2)); // 2列 recyclerView.setAdapter(new MultiColumnAdapter(data)); popup.setContentView(recyclerView); popup.showAsDropDown(spinner); }); ``` --- ### 3. 样式自定义 - **修改背景/字体**:在布局文件中设置`android:background`和`android:textColor` - **调整间距**:通过`android:layout_margin`控制列间距 - **添加分割线**:在`RecyclerView`中通过`ItemDecoration`添加 --- ### 完整示例代码 [GitHub参考项目](https://github.com/android/views-widgets-samples)[^1] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值