Android第五讲——Fragment(碎片)

目录

#Fragment

Fragment (碎片)

主要为了适应不同分辨率的手机
Fragment的生命周期:
这里写图片描述

它与Activity生命周期的不同:
这里写图片描述
· 必须嵌入到一个Activity
· 必须要继承FragmentActivity 为了兼容性 获得FragmentManager要用getSupportFragmentManager
· 继承Fragment自定义一个Fragment在Activity的xml中引用Fragment <class=”完整的包名+类名”>

1、修改activity_main.xml,添加一个FrameLayout,布局下边是三个按钮。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  <!--引入Fragment时,注意class 完整包名+类名-->
    <fragment
    android:id="@+id/fragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    class="com.lingzhuo.test.myfragment.fragment.FirstFragment"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:orientation="horizontal"
        android:background="#ffffff">

        <Button
            android:id="@+id/button_fragment1"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:text="Fragment1" />

        <Button
            android:id="@+id/button_fragment2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:text="Fragment2" />

        <Button
            android:id="@+id/button_fragment3"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:text="Fragment3" />

    </LinearLayout>
</RelativeLayout>

为了能够动态的添加Fragment,将fragment改为FrameLayout

    <FrameLayout
        android:id="@+id/framelayout_contairs"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

2、创建3个fragment
first_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:text="按钮测试"/>
</LinearLayout>

second_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">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是第二个Fragment" />
</LinearLayout>

third_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">

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="测试的输入框" />
</LinearLayout>

3、新建一个包fragment,用来盛放各种fragment,创建三个类,对应三个fragment布局
FirstFragement

/**
 * 要继承Fragment
 * Created by Went_Gone on 2015/9/6.
 */
public class FirstFragment extends Fragment {
    private Button mBtnTest;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_fragment, null);
        mBtnTest = (Button) view.findViewById(R.id.button);
        mBtnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "点击了按钮", Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }
}

SecondFragement

/**
 * Created by Went_Gone on 2015/9/6.
 */
public class SecondFragment extends Fragment {
    private TextView mTextView;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.second_fragment, null);
        mTextView = (TextView) view.findViewById(R.id.textview);
        return view;
    }
    public void setText(String text){
        if (mTextView!=null){
            mTextView.setText(text);
        }
    }
}

ThirdFragement

/**
 * Created by Went_Gone on 2015/9/6.
 */
public class ThirdFragment extends Fragment {
    private EditText mEditText;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.third_fragment, null);
        mEditText = (EditText) view.findViewById(R.id.edittext);
        return view;
    }
    public String getText(){
        String s = null;
        if (mEditText!=null){
            s = mEditText.getText().toString();
        }
        return s;
    }
}

4、修改MianActivity.java,为了兼容2.3系统要继承FragementActivity

/**
 * 为了兼容2.3的系统,注意继承的是FragmentActivity
 */
public class MainActivity extends FragmentActivity implements View.OnClickListener {
    //动态添加Fragment,将Fragment添加到FrameLayout上
    private FrameLayout mFrameLayout;
    private Button mBtnFrame1;
    private Button mBtnFrame2;
    private Button mBtnFrame3;
    private FragmentManager fragmentManager;
    private FragmentTransaction transaction;
    private FirstFragment firstFragment;
    private SecondFragment secondFragment;
    private ThirdFragment thirdFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mFrameLayout = (FrameLayout) findViewById(R.id.framelayout_contairs);
        mBtnFrame1 = (Button) findViewById(R.id.button_fragment1);
        mBtnFrame2 = (Button) findViewById(R.id.button_fragment2);
        mBtnFrame3 = (Button) findViewById(R.id.button_fragment3);
        mBtnFrame1.setOnClickListener(this);
        mBtnFrame2.setOnClickListener(this);
        mBtnFrame3.setOnClickListener(this);
        fragmentManager = getSupportFragmentManager();//初始化FragmentManager

        //将View3中输入框中的输入信息传到View2中
        firstFragment = new FirstFragment();
        secondFragment = new SecondFragment();
        thirdFragment = new ThirdFragment();
        transaction = fragmentManager.beginTransaction();//先begin事务
        //先添加后隐藏,以后不能用repalce
        transaction.add(R.id.framelayout_contairs,firstFragment);
        transaction.add(R.id.framelayout_contairs,secondFragment);
        transaction.add(R.id.framelayout_contairs,thirdFragment);
        transaction.hide(firstFragment);
        transaction.hide(secondFragment);
        transaction.commit();//最后commit事务
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_fragment1:
                //类似于事务的处理 begin开始,commit提交
                transaction = fragmentManager.beginTransaction();
//                transaction.replace(R.id.framelayout_contairs,firstFragment);//replace相当于全部remove掉所有的Fragment,再添加新的Fragment
                transaction.hide(secondFragment);
                transaction.hide(thirdFragment);
                transaction.show(firstFragment);
                transaction.commit();
                break;
            case R.id.button_fragment2:
                String text = thirdFragment.getText();
                transaction = fragmentManager.beginTransaction();
//                transaction.replace(R.id.framelayout_contairs,secondFragment);
                secondFragment.setText(text);
                transaction.hide(firstFragment);
                transaction.hide(thirdFragment);
                transaction.show(secondFragment);
                transaction.commit();
                break;
            case R.id.button_fragment3:
                transaction = fragmentManager.beginTransaction();
//                transaction.replace(R.id.framelayout_contairs,thirdFragment);
                transaction.hide(secondFragment);
                transaction.hide(firstFragment);
                transaction.show(thirdFragment);
                transaction.commit();
                break;
            default:
                break;
        }
    }
}

运行结果:这里写图片描述

练习:
i activity_main.xml中添加FrameLayout,RadioGroup与3个RadioButton
textColor设置点击变色:drawable中添加text_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue" android:state_checked="true"/>
    <item android:color="@color/grey"/>
</selector>

ii 创建3个fragement的xml。并创建3个继承于fragement类分别指向创建的xml
iii 在MainActivity中

public class MainActivity extends FragmentActivity implements RadioGroup.OnCheckedChangeListener{
    private RadioGroup mRadioGroup;
    private FragmentManager manager;
    private FragmentTransaction transaction;
    private MessageFragment mMessageFragment;
    private ContactsFragment mContactsFragment;
    private DynamicFragment mDynamicFragment;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);
        mRadioGroup.setOnCheckedChangeListener(this);
        manager = getSupportFragmentManager();
        mMessageFragment = new MessageFragment();
        mContactsFragment = new ContactsFragment();
        mDynamicFragment = new DynamicFragment();
        transaction = manager.beginTransaction();
        transaction.add(R.id.framelayout_contairs,mMessageFragment);
        transaction.add(R.id.framelayout_contairs,mContactsFragment);
        transaction.add(R.id.framelayout_contairs,mDynamicFragment);
        transaction.hide(mMessageFragment);
        transaction.show(mContactsFragment);
        transaction.hide(mDynamicFragment);
        transaction.commit();
        mRadioGroup.check(R.id.radiobutton_contacts);//一开始显示联系人
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        transaction = manager.beginTransaction();
        transaction.hide(mMessageFragment);
        transaction.hide(mContactsFragment);
        transaction.hide(mDynamicFragment);
        switch(checkedId){
            case R.id.radiobutton_message:
                transaction.show(mMessageFragment);
                break;
            case R.id.radiobutton_contacts:
               transaction.show(mContactsFragment);
                break;
            case R.id.radiobutton_dynamic:
                transaction.show(mDynamicFragment);
                break;
            default:
                break;
        }
        transaction.commit();
    }
}

运行结果如图:这里写图片描述

模仿微信:可左右滑动的Fragment

要想实现可以左右滑动的Fragment,可结合ViewPager。增添一个FragmentAdapter。
i 将activity_main.xml修改一下,将Fragment改为v4包下的ViewPager;

<android.support.v4.view.ViewPager
       android:id="@+id/viewpager"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_weight="1">

   </android.support.v4.view.ViewPager>

ii 原来创建的继承于Fragemnt的3个类不变,增加一个包adapter,用来存储fragmentadapter,复写两个方法getItem、getCount,一个构造器。

/**
 * Created by Went_Gone on 2015/9/7.
 */
public class MyFragmentAdapter extends FragmentPagerAdapter{
    private List<Fragment> mFragments;
    public MyFragmentAdapter(FragmentManager fm,List<Fragment> mFragments) {
        super(fm);
        this.mFragments = mFragments;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }
}

iii MainActivity中增加一个List<Fragment>,将初始化后的3个Fragment添加进去。给ViewPager添加监听器和事件。

mFragment = new ArrayList<>(); 
mFragment.add(mMessageFragment);
mFragment.add(mContactsFragment);
mFragment.add(mDynamicFragment);

     mAdapter = new MyFragmentAdapter(manager, mFragment);
        mViewPager.setAdapter(mAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switch (position){
                    case 0:
                        mRadioGroup.check(R.id.radiobutton_message);
                        break;
                    case 1:
                        mRadioGroup.check(R.id.radiobutton_contacts);
                        break;
                    case 2:
                        mRadioGroup.check(R.id.radiobutton_dynamic);
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        mViewPager.setCurrentItem(1);//将ViewPager设置到第二页

//RadioGroup的事件修改一下,与ViewPager相关联
 @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        transaction = manager.beginTransaction();
        transaction.hide(mMessageFragment);
        transaction.hide(mDynamicFragment);
        transaction.hide(mContactsFragment);
        switch (checkedId) {
            case R.id.radiobutton_message:
                transaction.show(mMessageFragment);
                mViewPager.setCurrentItem(0);
                break;
            case R.id.radiobutton_contacts:
                transaction.show(mContactsFragment);
                mViewPager.setCurrentItem(1);
                break;
            case R.id.radiobutton_dynamic:
                transaction.show(mDynamicFragment);
                mViewPager.setCurrentItem(2);
                break;
            default:
                break;
        }
        transaction.commit();
    }

运行结果如图:这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值