美文网首页程序员
Android Fragment详解

Android Fragment详解

作者: Game0ver | 来源:发表于2019-02-07 01:24 被阅读4次

    定义

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


      点击前
      点击后

    相关文章

      网友评论

        本文标题:Android Fragment详解

        本文链接:https://www.haomeiwen.com/subject/hukwsqtx.html