手记

Android Fragment详解

定义

碎片(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. 运行结果如下


    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. 运行效果如下


    点击前


    点击后



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


0人推荐
随时随地看视频
慕课网APP