目录
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();
}
运行结果如图: