Fragment详解(二)--->生命周期详解

简介: MainActivity如下: package cc.testsimplefragment1;import android.app.Activity;import android.

MainActivity如下:

package cc.testsimplefragment1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 * Demo描述:
 * Fragment生命周期
 * 
 * 测试方法:
 * 在界面中从上至下点击各个按钮
 * 
 * 参考资料:
 * 1 Android疯狂讲义(第二版)
 * 2 http://blog.163.com/supered_yang@126/blog/static/4126004120131710545228/
 * 3 http://blog.csdn.net/t12x3456/article/details/8104574
 *   Thank you very much
 * 
 */
public class MainActivity extends Activity{
	private Button mStartActivityButton;
	private Button mAddFragmentButton;
	private Button mReplaceAndBackFragmentButton;
	private Button mReplaceFragmentButton;
	private Button mFinishButton;
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
	
	private void init(){
		mStartActivityButton = (Button) findViewById(R.id.startActivityButton);
		mStartActivityButton.setOnClickListener(new ClickListenerImpl());
		
		mAddFragmentButton = (Button) findViewById(R.id.addFragmentButton);
		mAddFragmentButton.setOnClickListener(new ClickListenerImpl());
		
		mReplaceAndBackFragmentButton = (Button) findViewById(R.id.replaceAndBackFragmentButton);
		mReplaceAndBackFragmentButton.setOnClickListener(new ClickListenerImpl());
		
		mReplaceFragmentButton = (Button) findViewById(R.id.replaceFragmentButton);
		mReplaceFragmentButton.setOnClickListener(new ClickListenerImpl());
		
		mFinishButton = (Button) findViewById(R.id.finishButton);
		mFinishButton.setOnClickListener(new ClickListenerImpl());
	}
	
	private class ClickListenerImpl implements OnClickListener{
		@Override
		public void onClick(View view) {
			switch (view.getId()) {
			case R.id.startActivityButton:
				Intent intent = new Intent(MainActivity.this, DialogStyleActivity.class);
				startActivity(intent);
				break;
			case R.id.addFragmentButton:
				TestLifecycleFragment testLifecycleFragment = new TestLifecycleFragment();
				getFragmentManager()
				.beginTransaction()
				.add(R.id.linearLayoutContainer, testLifecycleFragment)
				.commit();
				break;
			case R.id.replaceAndBackFragmentButton:
				AnotherFragment anotherFragment1 = new AnotherFragment();
				getFragmentManager()
				.beginTransaction()
				.replace(R.id.linearLayoutContainer, anotherFragment1)
				.addToBackStack("test")
				.commit();
				break;
			case R.id.replaceFragmentButton:
				AnotherFragment anotherFragment2 = new AnotherFragment();
				getFragmentManager()
				.beginTransaction()
				.replace(R.id.linearLayoutContainer, anotherFragment2)
				.commit();
				break;
			case R.id.finishButton:
				finish();
				break;
			default:
				break;
			}
			
		}
		
	}
}


TestLifecycleFragment如下:

package cc.testsimplefragment1;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class TestLifecycleFragment extends Fragment {
	final String TAG = "log";
	/**
	 * 该Fragment被添加到Activity时调用.
	 * 只会被调用一次
	 */
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		Log.d(TAG, "-------onAttach------");
	}

	/**
	 * 创建该Fragment时调用.
	 * 只会被调用一次
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(TAG, "-------onCreate------");
	}

	/**
	 * 每次创建和绘制该Fragment的View组件时调用.
	 * Fragment会显示该方法返回的View
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle data) {
		Log.d(TAG, "-------onCreateView------");
		TextView tv = new TextView(getActivity());
		tv.setGravity(Gravity.CENTER_HORIZONTAL);
		tv.setText("这是一个用于测试的Fragment");
		tv.setTextSize(40);
		return tv;
	}

	/**
	 * 当Fragment所在的Activity被启动完成后
	 * 调用该方法
	 */
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		Log.d(TAG, "-------onActivityCreated------");
	}

	/**
	 * 启动Fragment时候调用该方法
	 */
	@Override
	public void onStart() {
		super.onStart();
		Log.d(TAG, "-------onStart------");
	}

	/**
	 * 恢复Fragment时候调用该方法.
	 * onStart()方法后一定会调用该onResume()方法
	 */
	@Override
	public void onResume() {
		super.onResume();
		Log.d(TAG, "-------onResume------");
	}
	
    /**
     * 暂停Fragment时候调用该方法
     */
	@Override
	public void onPause() {
		super.onPause();
		Log.d(TAG, "-------onPause------");
	}

	/**
     * 停止Fragment时候调用该方法
     */
	@Override
	public void onStop() {
		super.onStop();
		Log.d(TAG, "-------onStop------");
	}

	/**
     * 销毁该Fragment所包含的View调用该方法
     */
	@Override
	public void onDestroyView() {
		super.onDestroyView();
		Log.d(TAG, "-------onDestroyView------");
	}

	/**
     * 销毁该Fragment时调用该方法
     * 该方法只会被调用一次
     */
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "-------onDestroy------");
	}

	/**
     * 将该Fragment从Activity中被删除,替换时调用该方法
     * 在onDestroy()方法后一定会调用该onDetach()方法.
     * 该方法只会被调用一次
     */
	@Override
	public void onDetach() {
		super.onDetach();
		Log.d(TAG, "-------onDetach------");
	}
}


AnotherFragment如下:

package cc.testsimplefragment1;

import android.app.Fragment;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class AnotherFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle data) {
		TextView textView = new TextView(getActivity());
		textView.setGravity(Gravity.CENTER_HORIZONTAL);
		textView.setText("另外一个Fragment");
		textView.setTextSize(40);
		return textView;
	}
}


DialogStyleActivity如下:

package cc.testsimplefragment1;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
/**
 * 备注说明:
 * 该Activity是对话框风格的Activity
 * 所以需要在配置文件中设置:
 * android:theme="@android:style/Theme.Holo.Dialog"
 *
 */
public class DialogStyleActivity extends Activity{
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		TextView textView = new TextView(this);
		textView.setText("对话框风格的Activity");
		setContentView(textView);
	}
}


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

    <LinearLayout
        android:id="@+id/linearLayoutContainer"
        android:layout_width="wrap_content"
        android:layout_height="160dp" >
    </LinearLayout>

    <Button
        android:id="@+id/addFragmentButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="加载目标Fragment" />
    
    <Button
        android:id="@+id/startActivityButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="启动对话框风格的Activity" />

    <Button
        android:id="@+id/replaceAndBackFragmentButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="替换目标Fragment,并加入Back栈" />

    <Button
        android:id="@+id/replaceFragmentButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="替换目标Fragment" />

    <Button
        android:id="@+id/finishButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="退出" />

</LinearLayout>


AndroidManifest.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest
	xmlns:android="http://schemas.android.com/apk/res/android"
	package="cc.testsimplefragment1"
	android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk
		android:minSdkVersion="11"
		android:targetSdkVersion="17" />
	<application
		android:icon="@drawable/ic_launcher"
		android:label="@string/app_name">
		<activity
			android:name=".MainActivity"
			android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		
		<activity
		    android:theme="@android:style/Theme.Holo.Dialog"
			android:name=".DialogStyleActivity"
			android:label="@string/app_name" />
		
	</application>
</manifest>


 

相关文章
|
8月前
|
JavaScript
Vue子组件调用父组件方法并传参的5种方式:$emit触发、传入子组件function、访问父组件$parent.function、用inject关联父组件provide的方法、用window.fun
Vue子组件调用父组件方法并传参的5种方式:$emit触发、传入子组件function、访问父组件$parent.function、用inject关联父组件provide的方法、用window.fun
ViewGroup在调用onMeasure时,会先测量父View,还是会先测量子View?
ViewGroup在调用onMeasure时,会先测量父View,还是会先测量子View?
单Acitivty+Fragment的优化写法。
一直以来,在写单Acitivty+Fragment的时候,标题栏的布局虽然 include 同一个,但是每次代码里都要对标题栏进行setText() ,而且每次都要写一遍标题栏的点击事件,而在以前的学习使用中,都没有考虑过去对它们进行一个优化。
77 0
使用NavHostFragment、navigation--- avtivity向fragment传值,fragment之间传值
使用NavHostFragment、navigation--- avtivity向fragment传值,fragment之间传值
265 0
|
容器
Fragment与Fragment相互切换之间的生命周期方法
最近一段时间忙于找工作,找到工作之后忙于项目上线,好久没有写过博客,现在感觉终于闲暇了,写一写这次项目中需要总结提炼的知识点,给自己留个印象吧,毕竟好记性不如烂笔头。
1593 0
|
Kotlin
我们真的了解 Activity 与 Fragment 的生命周期吗?
      小菜中午和朋友闲聊,被问到 Activity 与 Fragment 的生命周期,以为是很基础的东西,基本可以把生命周期说全,但是被问到 Activity 与 Fragment 交互的生命周期运行顺序,切换 Fragment 时候的生命周期顺序,以及切换完之后退出时的生命周期...瞬间感觉基础知识太不扎实了。
1082 0
|
容器 缓存
Android--Fragment 实现懒加载和不重复加载
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79217223 基类: package fragment; import android.
1511 0
|
XML API Android开发
addTextChangedListener在fragment中多次执行问题
文章同步发布到CSDN:http://blog.csdn.net/ling9400/article/details/60323283 转载请注明出处:http://blog.
1126 0
|
容器 索引
ViewPager+Fragment取消预加载(延迟加载)
在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。 例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment。 这样虽然有
1600 0