Android无UIFragment用法:findFragmentByTag

之前一直不是很懂当Fragment没有UI的时候如何在Activity中找到它,我知道可以通过findFragmentByTag的方法,但是具体怎么实现却一直没有找到一个完整的Demo,网上很多资料都是一笔带过。后来查看官方文档,根据官方文档写了一个Demo,具体如下:

首先我们新建一个Fragment,之前我们都是要在Fragment中复写onCreateView方法返回一个布局,不过在这里,我们将要是实现的是通过findFragmentByTag的方法找到Fragment,并通过add(Fragment,fragment_TAG)的方法添加,就无需复写onCreateView方法,就算复写了,由于我们添加Fragment的方式的原因,Activity也不会出现布局,可以说此时onCreateView是无效的。这点需要注意一下。

Fragment1.java  代码:

package com.example.fragment;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

	Timer timer = new Timer();

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);

		timer.schedule(new TimerTask() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				Log.v("test", "test");
			}
		}, 0, 2000);
	}

	@Override
	public void onDestroyView() {
		// TODO Auto-generated method stub
		super.onDestroyView();
		if(timer!=null)
		{
			timer.cancel();
			timer = null;
		}
	}

}

这里我们实现它的后台功能,通过利用定时器不断在后台打印Log。


MainActivity.java 代码如下:

package com.example.fragment;

import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

	final String FRAGMENT_TAG = "fragment";
	Fragment1 fragment;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		FragmentManager fragmentManager = getFragmentManager();
		FragmentTransaction fragmentTransaction = fragmentManager
				.beginTransaction();
		//FRAGMENT_TAG通过查找得到该Fragment,第一次还没添加的时候得到的fragment为null
		fragment = (Fragment1) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
		if (fragment == null) {
			fragment = new Fragment1();
			fragment.setTargetFragment(fragment, 0);
			//重新添加fragment
			fragmentTransaction.add(fragment, FRAGMENT_TAG).commit();
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

首先通过findFragmentByTag查找Fragment

fragment = (Fragment1) fragmentManager.findFragmentByTag(FRAGMENT_TAG);

不过此时由于Fragment还没有添加进来,通过FRAGMENT_TAG是找不到的,所以此时fragment的值为null,紧接着如下:

if (fragment == null) {
			fragment = new Fragment1();
			fragment.setTargetFragment(fragment, 0);
			//重新添加fragment
			fragmentTransaction.add(fragment, FRAGMENT_TAG).commit();
		}

新建Fragment并附带FRAGMENT_TAG  进行add操作,相应的,也就将fragment与 FRAGMENT_TAG  绑定在一起了。此时如果对手机或模拟器进行横竖屏切换,通过Log可以查看到此时如下调用后

fragment = (Fragment1) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
fragment的值为 Fragment1,此时就不会重建Fragment了。

activity_main.xml 代码如下:

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

</FrameLayout>

Fragment1 无UI,也就不用布局文件。




你可能感兴趣的:(tag,Fragment,无UI)