之前一直不是很懂当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,也就不用布局文件。