Fragment 一个简单的全景感受

2017-11-01 16:14:15来源:http://www.jianshu.com/p/0082df8fe02f作者:方毅超人点击

分享

前言:常常会忘记一些很基础的知识点,所以把这些个常用却很少从头写到尾的代码知识,做了个简单的从头到尾的简单浏览。需要时看一看,可以帮助加快我们回忆的速度。


FragmentTransaction 中对Fragment有如下几种操作:

1,attach(), detach()不是很常用;
2,add(), remove(),将fragment添加和移除;
3,show(), hide(),是用来设置fragment的显示和隐藏状态, 这两个方法并不对应fragment的状态变化,只是将view设置为visible和gone,然后调用onHiddenChanged()的回调;
4,replace()= remove() + add()。


把Fragment加入Activity
加载方式1:通过Activity的布局文件将Fragment加入Activity

其中android:name属性填上你自己创建的fragment的完整类名。
当系统创建这个Activity的布局文件时,系统会实例化每一个fragment,并且调用它们的onCreateView()方法,来获得相应fragment的布局,并将返回值插入fragment标签所在的地方。


加载方式2:通过编程的方式将Fragment加入到一个ViewGroup中
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

(注,如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager();)
之后,用add()方法加上Fragment的对象:


ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

以下是“全景浏览”:

涉及了fragment和activity的相关代码,一下代码是集成了几篇出色的文章而整理出来的所谓代码例子,甚至可以直接粘贴复制就能用了。


Fragment:
/**
* @desc
* @auth 方毅超
* @time 2017/10/30 14:00
*/
public class ExampleFragment extends Fragment {
Bundle savedState;
public ExampleFragment() {
super();
}
/**
* @param isVisibleToUser
* 注意:setUserVisibleHint()方法是在onCreate()方法、
* 甚至是onAttach()方法之前调用的,所以它里面不能有任何对Context上下文对象的调用!
* getUserVisibleHint()返回的变量,是App提供的代表此Fragment当前对于用户是否可见的一个布尔值;
*
* setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false
* 如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true
* 如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false
* 总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调
* 如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Restore State Here
if (!restoreStateFromArguments()) {
// First Time, Initialize something here
onFirstTimeLaunched();
}
}
/**
* 第一次加载该类时,需要做的动作
*/
protected void onFirstTimeLaunched() {
// TODO: 2017/10/30
}
//===============必须实现的三个回调函数===============//
/**
* @param savedInstanceState
* 系统在创建Fragment的时候调用这个方法,
* 这里应该初始化相关的组件,
* 一些即便是被暂停或者被停止时依然需要保留的东西。
*/
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
}
/**
* @param inflater
* @param container
* @param savedInstanceState
* @return
* 当第一次绘制Fragment的UI时系统调用这个方法,
* 必须返回一个View,如果Fragment不提供UI也可以返回null。
*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
return inflater.inflate(R.layout.example_fragment_layout, container, false);
}
/**
* 当用户离开Fragment时第一个调用这个方法,
* 需要提交一些变化,因为用户很可能不再返回来。
*/
@Override
public void onPause() {
super.onPause();
}
//========================保存数据相关=====================//
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save State Here
saveStateToArguments();
}
/*onSaveInstanceState中保存数据很简单,
因为它有Bundle参数,但是onDestroyView没有,那保存在哪里呢?
答案是能和Fragment一起共存的Argument。
setArguments方法必须在fragment创建以后,添加给Activity前完成。
千万不要,首先调用了add,然后设置arguments。*/
@Override
public void onDestroyView() {
super.onDestroyView();
// Save State Here
saveStateToArguments();
}
////////////////////
// Don't Touch !!
////////////////////
private void saveStateToArguments() {
if (getView() != null)
savedState = saveState();
if (savedState != null) {
Bundle b = getArguments();
b.putBundle("internalSavedViewState8954201239547", savedState);
}
}
//////////////////////////////
// Save Instance State Here
//////////////////////////////
private Bundle saveState() {
Bundle state = new Bundle();
// For Example
//state.putString(text, tv1.getText().toString());
onSaveState(state);
return state;
}
/**
* @param outState 保存该类当前的各种数据状态
*/
protected void onSaveState(Bundle outState) {
// TODO: 2017/10/30
// super.onSaveState(outState);
// For example:
//outState.putString(text, tvSample.getText().toString());
}
//========================保存数据相关结束=====================//
//========================恢复数据相关=====================//
////////////////////
// Don't Touch !!
////////////////////
private boolean restoreStateFromArguments() {
Bundle b = getArguments();
savedState = b.getBundle("internalSavedViewState8954201239547");
if (savedState != null) {
restoreState();
return true;
}
return false;
}
/////////////////////////////////
// Restore Instance State Here
/////////////////////////////////
private void restoreState() {
if (savedState != null) {
// For Example
//tv1.setText(savedState.getString(text));
onRestoreState(savedState);
}
}
/**
* @param savedInstanceState 恢复该类当前的各种数据状态
*/
protected void onRestoreState(Bundle savedInstanceState) {
// TODO: 2017/10/30
// super.onRestoreState(savedInstanceState);
// For example:
//tvSample.setText(savedInstanceState.getString(text));
}
//========================恢复数据相关结束=====================//
}

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

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/num1"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/num2"
/>
</LinearLayout>

主Activity:
/**
* @desc
* @auth 方毅超
* @time 2017/10/30 14:31
*/
public class ExampleActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_learn_fragment);

//在程序中加入Fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.linear, fragment);
fragmentTransaction.commit();
}
}

Activity的布局文件:
<LinearLayout 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"
android:orientation="vertical"
>
<Button
android:id="@+id/btn1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/btn1"
/>
<fragment
android:name="com.example.learningfragment.ExampleFragment"
android:id="@+id/fragment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/btn2"
/>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<Button
android:id="@+id/btn3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/btn3"
/>
</LinearLayout>
</LinearLayout>

感谢:
Android中保存和恢复Fragment状态的最好方法
Android Fragment 基本介绍
【Android】再来一篇Fragment懒加载(只加载一次哦)




最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台