您的位置:首页 > 其它

自己对于Fragment的一些总结

2014-06-01 22:10 309 查看
Fragment和Activity的生命周期方法类似,只是Fragment比Activity多了几个方法而已,如:

// onAttach方法:Fragment和Activity建立关联的时候调用*/

1.onAttach(Activity activity)

//onCreateView方法:为Fragment加载布局时调用

2.onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState

// Fragment中的布局被移除时调用

3.onDestroyView()

Fragment是sdk 3.0出现的,主要原因是适应大屏,如平板。

//下面的demo主要讲了如何实现Fragment和Fragment之间的通信,Fragment之间并不能直接通信,Activity是

是Fragment之间通信的桥梁。下面是一个简单的例子。

本Demo为适应小屏和大屏(平板),有连个主要布局,通过代码可看出。

news_articles.xml ( 用于大屏(平板))

<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:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />

</LinearLayout>
news_articles.xml ( 用于小屏)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />


//列表HeadlinesFragment .java

public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;

public interface OnHeadlineSelectedListener {

public void onArticleSelected(int position);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Log.i("HONEYCOMB-------------->", Build.VERSION_CODES.HONEYCOMB+"");//3.0
Log.i("SDK_INT---------------->", Build.VERSION.SDK_INT+"");//4.2.2

//判断当前的sdk版本,如果本设备版本大于3.0则用新的API
int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));
}

@Override
public void onStart() {
super.onStart();

//大屏
if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) {

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//选择模式(单选,还有多选模式)
}
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);

try {

mCallback = (OnHeadlineSelectedListener) activity;

} catch (ClassCastException e) {

throw new ClassCastException(activity.toString()
+ "必须要实现OnHeadlineSelectedListener");

}
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
//调用此方法实现接口回调
mCallback.onArticleSelected(position);
getListView().setItemChecked(position, true);
}
}


MainActivity.java

public class MainActivity extends FragmentActivity
implements HeadlinesFragment.OnHeadlineSelectedListener {

/**
*savedInstanceState保存Activity的状态信息 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);

/**
*  此条件成立则设备是小屏设备*/
if (findViewById(R.id.fragment_container) != null) {

if (savedInstanceState != null) {
return;
}
//实例化Fragment
HeadlinesFragment firstFragment = new HeadlinesFragment();
Bundle bundle=getIntent().getExtras();
firstFragment.setArguments(bundle);
//开启事务,然后提交
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();

}
}

public void onArticleSelected(int position) {

ArticleFragment articleFrag = (ArticleFragment)getSupportFragmentManager().findFragmentById(R.id.article_fragment);
//加载的是大屏布局文件
if (articleFrag != null) {

articleFrag.updateArticleView(position);

} else {
//加载的是小屏布局文件
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
//通过Bundle携带所点击列表项的id值发送给ArticleFragment
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
//事务
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();//提交

}

}

}


ArticleFragment.java
public class ArticleFragment extends Fragment {
final static String ARG_POSITION = "position";
int mCurrentPosition = -1;

//加载布局的时候调用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

if (savedInstanceState != null) {
mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
}
return inflater.inflate(R.layout.article_view, container, false);
}

@Override
public void onStart() {
super.onStart();

Bundle args = getArguments();//在该步接受HeadlinesFragment传递过来的Bundle
if (args != null) {
int i=args.getInt(ARG_POSITION);
updateArticleView(i);
} else if (mCurrentPosition != -1) {//此处是针对应用崩溃时onCreateView得到的保存的状态值调用
updateArticleView(mCurrentPosition);
}

}

//显示对应的文章
public void updateArticleView(int position) {
TextView article = (TextView) getActivity().findViewById(R.id.article);
article.setText(Ipsum.Articles[position]);
mCurrentPosition = position;
}

//系统强制退出的时候调用(例如系统崩溃,应用崩溃),非人工退出
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

outState.putInt(ARG_POSITION, mCurrentPosition);//保存状态
}
}


猛击下载资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: