安卓基础--fragment

2017-06-26  本文已影响56人  小白猿

本文是我学习安卓的笔记的一部分,查看详细完整笔记请参阅

简介

fragment中文译为碎片,可以嵌入活动中,让程序充分合理的利用空间,在平板中广泛应用。

基本使用

创建两个布局备用

创建两个类,继承自Fragment

继承Fragment类IDE中包含两种,建议选择support-v4

修改主布局

具体代码

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="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="BUTTON"/>

</LinearLayout>

LeftFragment 类

public class LefFrament extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.left_fragment,container,false);
    }
}

right_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"
    android:background="#00ff00">
    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="12sp"
        android:text="This is right frament"
        />

</LinearLayout>

RightFragment 类

public class RightFrament extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return  inflater.inflate(R.layout.right_fragment,container,false);
    }
}

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.qinxinghua.fragmentprac.LefFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.qinxinghua.fragmentprac.RightFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />
    
</LinearLayout>
运行结果

动态改变fragment

我们在上面的代码的基础上进行修改,因为需要动态的改变,所以我们在创建一个fragment,布局为一个TextView,用背景色加以区别

再创建一个fragment

修改主布局

思路:将先前的右边的fragment改为<FrameLayout>的布局,属性与先前的右布保持一致,我个人认为是通过布局提供一种占位,后续中将需要的组件进行添加

修改主活动

具体代码

another布局和类不在赘述

主布局代码

<?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.qinxinghua.fragmentprac.LefFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <FrameLayout
        android:id="@+id/right_fragment"
        android:name="com.example.qinxinghua.fragmentprac.RightFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">
    </FrameLayout>
</LinearLayout>

主活动代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
        replaceFragment(new RightFrament());
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button:
                replaceFragment(new AntherRightFragment());
                break;
            default:
                break;
        }
    }

    /**
     * 核心方法
     */
    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.right_fragment,fragment);
        fragmentTransaction.commit();

    }
}
效果图

Fragment 模拟返回栈

思路:将上例中的布局容器当做一种栈结构,进后进先出,在界面back返回过程中在将组件出栈。

实现:只需调用事务的addToBackStack的方法,参数为一个字符串的名字,用于描述栈的状态,在不需要描述的时候可以传入null

   /**
     * 核心方法
     */
    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.right_fragment,fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

    }
效果图

Fragment 通信

使用限定符

场景:灵活的决定在不同屏幕尺寸或者不同的分辨率下使用不同的布局

修改代码

在手机和平板不同的设备中分别运行

手机效果图 平板效果图

常见限定符

根据尺寸区别 根据分辨率区别

最小宽度限定符

由于很难界定large到底是多大,或者没有办法界定一个准确的尺寸,故最小宽度限定符能更好的解决这样问题

上一篇 下一篇

猜你喜欢

热点阅读