«

【Android】使用Fragment进行Activity布局

时间:2024-3-2 18:45     作者:韩俊     分类: Android


根据官方文档:

Fragment表现Activity中用户界面的一个行为或者是一部分。你可以在一个单独的activity上把多个fragment组合成为一个多区域的UI,并且可以在多个activity中再使用。你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入事件,并且可以在activity运行时添加或者删除。


所以我们可以通过Fragment来构建我们UI的不同区域,并且不同的Fragment可以加以复用。Activity中也可以动态地管理自己的Fragment。下面创建一个Demo,用来实现根据点击不同的按钮来对不同的Fragment进行切换。


我们需要创建3个Fragment,用来根据按钮切换不同的布局。创建Fragment的方法非常简单,我们需要定义一个静态的布局文件,然后创建一个Fragment的导出类,并重写其中的onCreateView方法。注意Fragment在3.0版本后才推出,所以在创建项目时应选择API11为最低版本。


这里只演示一个Fragment的布局文件和对应类的实现

<?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">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="BTN2 Fragment"
        android:gravity="center"
        android:textSize="40dp"/>
</LinearLayout>

package com.example.wayne_t.fragmentdemo;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Wayne-T on 2015/6/10.
 */
public class Btn2Fragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.btn2_layout, container, false);
    }
}


然后是我们目标Activity的布局文件,在其中需要添加3个按钮,然后设置一个FrameLayout去用来切换3个Fragment

<?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">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn1"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:text="Btn1"/>
        <Button
            android:id="@+id/btn2"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:text="Btn2"/>
        <Button
            android:id="@+id/btn3"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:text="Btn3"/>
    </LinearLayout>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/content">

    </FrameLayout>
</LinearLayout>

对应的Activity中需要设置事件去监听按钮,在onCreate中我们设置默认的Fragment,然后在监听事件中设置Fragment切换的操作。这里使用的是FragmentTransaction的replace方法完成对Fragment的切换。

注意切换时需要实例化对应的Fragment的导出类,否则直接抛出异常。

package com.example.wayne_t.fragmentdemo;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by Wayne-T on 2015/6/10.
 */
public class SecondDemo extends Activity implements View.OnClickListener {
    private ContentFragment cf;
    private Btn2Fragment b2f;
    private Btn3Fragment b3f;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Button btn1 = (Button) findViewById(R.id.btn1);
        Button btn2 = (Button) findViewById(R.id.btn2);
        Button btn3 = (Button) findViewById(R.id.btn3);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        // 默认fragment
        FragmentManager fmanager = getFragmentManager();
        FragmentTransaction ftransaction = fmanager.beginTransaction();
        cf = new ContentFragment();
        ftransaction.replace(R.id.content, cf);
        ftransaction.commit();
    }

    @Override
    public void onClick(View v) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        switch(v.getId()) {
            case R.id.btn1: if(cf == null) cf = new ContentFragment();
                            ft.replace(R.id.content, cf);
                            break;
            case R.id.btn2: if(b2f == null) b2f = new Btn2Fragment();
                            ft.replace(R.id.content, b2f);
                            break;
            case R.id.btn3: if(b3f == null) b3f = new Btn3Fragment();
                            ft.replace(R.id.content, b3f);
                            break;
            default: break;
        }
        ft.commit();
    }
}

ContentFragment,Btn2Fragment,Btn3Fragment都是Fragment的导出类。

已经创建的Fragment也可以直接在Activity的布局文件中使用,方法如下:

        <fragment
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/title_fragment"
            android:name="com.example.wayne_t.fragmentdemo.TitleFragment"
            tools:layout="@layout/title_layout" />
        <fragment
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/content_layout"
            android:name="com.example.wayne_t.fragmentdemo.ContentFragment"
            tools:layout="@layout/content_layout" />

效果图:


标签: android

热门推荐