Android --- 交换两个布局

准备布局

exchange_out_layout

exchange_in_layout

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginTop="20dp"
    tools:context=".fragment.addaccount.AddExchangeFragment">


    <LinearLayout
        android:id="@+id/exchange_out_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center_vertical"
        android:background="@drawable/selec_tab"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/change_out_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="请选择转出账户" />

        <TextView
            android:id="@+id/change_out_money"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:text="¥10.00" />

        <TextView
            android:id="@+id/change_out_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:background="@drawable/add_tab_background"
            android:text="全部转出" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/exchange_icon"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@drawable/exchange_down"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/exchange_in_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="@drawable/selec_tab"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingLeft="10dp"
        android:paddingRight="10dp">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="请选择转入账户" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:text="¥10.00" />

        <TextView
            android:id="@+id/textView6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/add_tab_background"
            android:padding="2dp"
            android:text="全部转出" />
    </LinearLayout>
</LinearLayout>

设计点击方法

为图片设计一个点击方法

复制代码
 exchange_icon = getView().findViewById(R.id.exchange_icon);
        exchange_icon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 交换逻辑
            }
        });

交换逻辑:

1.获取父组件

parentLayout = (ViewGroup) linearLayout_out.getParent(); // 得到父容器

2.找到在父组件中,这两个子布局的位序

获取布局位序 --- int index1 = parentLayout.indexOfChild(linearLayout_out);
在Android中,ViewGroup(比如LinearLayout、RelativeLayout等)中的子View的顺序是由它们在ViewGroup中的索引(index)决定的。索引表示子View在ViewGroup中的位置,第一个子View的索引为0,依次递增。

在上述代码中,通过调用parentLayout.indexOfChild(view)方法可以获取指定子View在其父ViewGroup中的索引位置。这样做是为了根据不同的索引位置来调整子View的顺序,实现布局的交换或调整。

3.在父组件中移除这两个子布局

删除布局 --- parentLayout.removeViewInLayout(linearLayout_in);

  1. 再将这两个子布局添加到对方的位置上,通过比较两个索引的大小来确定需要交换的两个布局的顺序。
  • 如果index1 < index2,说明布局1在布局2之前,此时应先将布局1添加到parentLayout中,然后再将布局2添加到parentLayout中;
  • 如果index1 >= index2,说明布局1在布局2之后或者二者在同一个位置,此时应先将布局2添加到parentLayout中,然后再将布局1添加到parentLayout中。
  • 添加布局 --- parentLayout.addView(linearLayout_out, index2);
  • 刷新布局 --- parentLayout.requestLayout();
复制代码
 exchange_icon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (parentLayout != null && linearLayout_in != null && linearLayout_out != null) {
                    int index1 = parentLayout.indexOfChild(linearLayout_out);
                    int index2 = parentLayout.indexOfChild(linearLayout_in);
                    parentLayout.removeViewInLayout(linearLayout_out);
                    parentLayout.removeViewInLayout(linearLayout_in);

                    if(index1 < index2) {
                        parentLayout.addView(linearLayout_in, index1);
                        parentLayout.addView(linearLayout_out, index2);
                    } else {
                        parentLayout.addView(linearLayout_out, index2);
                        parentLayout.addView(linearLayout_in, index1);
                    }
                    parentLayout.requestLayout();
                }

            }
        });

效果:

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
7177771 天前
研发平台选哪家比较好:2026年主流平台对比与Gitee选型指南
人工智能·gitee
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas