为了账号安全,请及时绑定邮箱和手机立即绑定

Android Fragment详解

标签:
Android

定义

碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用非常广泛。

碎片的简单用法

下面将通过例子来简单的说明Fragment的简单用法

  1. 新建一个左侧碎片布局left_fragment.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button"
        /></LinearLayout>
  1. 再新建一个右侧碎片布局right_fragment.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#00ff00"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20dp"
        android:text="you are my life"
        /></LinearLayout>
  1. 接着新建一个LeftFragment类,并让它继承Fragment

package com.example.apple.fragmenttest;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class LeftFragment extends Fragment {    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view=inflater.inflate(R.layout.left_fragment,container,false);        return view;

    }

}
  1. 用同样的方法新建一个RightFragment类

package com.example.apple.fragmenttest;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class RightFragment extends Fragment {    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view=inflater.inflate(R.layout.right_fragment,container,false);        return view;

    }
}
  1. 最后修改activity_main.xml中的代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.apple.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />

    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.apple.fragmenttest.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />


    </FrameLayout></LinearLayout>
  1. 运行结果如下


    webp

    image.png

动态添加碎片

为了将程序界面定制得更加多样化,我们可以根据具体情况来动态地添加碎片。下面我们将继续在上面的代码中进行完善

  1. 新建another_right_fragment.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ffff00"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20dp"
        android:text="another"
        /></LinearLayout>
  1. 新建AnotherRightFragment作为另一个右侧碎片,代码如下:

package com.example.apple.fragmenttest;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class AnotherRightFragment extends Fragment {    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view=inflater.inflate(R.layout.another_right_fragment,container,false);        return view;

    }
}
  1. 修改activity_main.xml中的代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <!--name属性表明要添加的碎片的类名-->
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.apple.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />

    <FrameLayout
        android:id="@+id/right_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        >

    </FrameLayout></LinearLayout>

可见我们把右侧碎片换成了FrameLayout

  1. 修改MainActivity中的代码实现动态添加碎片功能,代码如下:

package com.example.apple.fragmenttest;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button);
        replaceFragment(new RightFragment());
        button.setOnClickListener(new View.OnClickListener() {            @Override
            public void onClick(View v) {                switch (v.getId()){                    case R.id.button:
                        replaceFragment(new AnotherRightFragment());                        break;                     default:                         break;
                }
            }
        });
    }    private void replaceFragment(Fragment fragment){
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction transaction=fragmentManager.beginTransaction();
        transaction.replace(R.id.right_layout,fragment);
        transaction.commit();
    }
}

从replaceFragment()方法中可以看出,动态添加碎片主要分为5步:

  • 创建待添加的碎片实例

  • 获取FragmentManager,在活动中可以直接通过getSupportFragmentManager()方法得到

  • 开启一个事务,通过调用beginTransaction()方法开启

  • 向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例

  • 提交事务

  1. 运行效果如下


    webp

    点击前


    webp

    点击后



作者:_Mrchen_
链接:https://www.jianshu.com/p/08b2fab91b6b


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消