两个fragment oom之间多次切换 OOM,请问是怎么回事

posts - 83, comments - 226, trackbacks - 0, articles - 0
  今天接着上一篇文章,讲解一下Fragment的控制,主要是切换View和页面替换等操作。还有就是如何获取Fragment的管理对象,以及与Activity的通信方式。
&(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:)
1、管理Fragment
要在activity中管理fragment,需要使用FragmentManager. 通过调用activity的getFragmentManager()取得它的实例.
可以通过FragmentManager做一些事情, 包括:&使用findFragmentById()(用于在activity layout中提供一个UI的fragment)或findFragmentByTag()(适用于有或没有UI的fragment)获取activity中存在的fragment。
将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令)。
使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener。
2、处理Fragment事务
  关于在activity中使用fragment的很强的一个特性是:根据用户的交互情况,对fragment进行添加、移除、替换以及执行其他动作。提交给activity的每一套变化被称为一个事务,可以使用在FragmentTransaction中的 API 处理。我们也可以保存每一个事务到一个activity管理的backstack,允许用户经由fragment的变化往回导航(类似于通过 activity往后导航)。
从 FragmentManager 获得一个FragmentTransaction实例:
FragmentManager fragmentManager =getFragmentManager();
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
  每一个事务都是同时要执行的一套变化。可以在一个给定的事务中设置你想执行的所有变化,使用诸如 add()、remove()和 replace()。然后, 要给activity应用事务,必须调用 commit()。  在调用commit()之前,你可能想调用 addToBackStack(),将事务添加到一个fragment事务的backstack。这个back stack由activity管理, 并允许用户通过按下 BACK按键返回到前一个fragment状态。
//创建修改实例
Fragment newFragment = newExampleFragment();
FragmentTransaction transaction =getFragmentManager().beginTransaction();
// Replace whatever is in thefragment_container view with this fragment,
// and add the transaction to the backstack
transaction.replace(R.id.fragment_container,newFragment);
transaction.addToBackStack(null);
//提交修改
  上面是如何将一个fragment替换为另一个,并在后台堆栈中保留之前的状态。在这个例子中,newFragment替换了当前layout容器中的由R.id.fragment_container标识的fragment。通过调用 addToBackStack(), replace事务被保存到back stack,因此用户可以回退事务,并通过按下BACK按键带回前一个fragment。
& & 如果添加多个变化到事务(例如add()或remove())并调用addToBackStack(),然后在你调用commit()之前的所有应用的变化会被作为一个单个事务添加到后台堆栈,BACK按键会将它们一起回退。添加变化到 FragmentTransaction的顺序不重要, 除以下例外:&
必须最后调用 commit()
如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序
  当执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后,那个fragment会被销毁,并且用户不能导航回到它。有鉴于此,当移除一个fragment时,如果调用了addToBackStack(), 那么fragment会被停止,如果用户导航回来,它将会被恢复。另外,对于每一个fragment事务,你可以应用一个事务动画,通过在提交事务之前调用setTransition()实现。
  调用 commit() 并不立即执行事务。恰恰相反,它将事务安排排期, 一旦准备好,就在activity的UI线程上运行(主线程)。如果有必要, 无论如何,你可以从你的UI线程调用executePendingTransactions()来立即执行由commit()提交的事务。但这么做通常不必要,除非事务是其他线程中的任务的一个从属。
&警告:你只能在activity保存它的状态(当用户离开activity)之前使用commit()提交事务.
3、与Activity通信
& &&&&&&&尽管Fragment被实现为一个独立于Activity的对象,并且可以在多个activity中使用,但一个给定的fragment实例是直接绑定到包含它的activity的。 特别的fragment可以使用 getActivity() 访问Activity实例, 并且容易地执行比如在activity layout中查找一个view的任务。如下面的代码:
View listView =getActivity().findViewById(R.id.list);
  同样地,activity可以通过从FragmentManager获得一个到Fragment的引用来调用fragment中的方法,使用findFragmentById() 或 findFragmentByTag()。
ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
  最后需要说一下Fragment的例子,Android官方已经提供了Fragment的各种使用的Demo例子,在我们SDK下面的API Demo里面就包含了Fragment的各种使用例子,需要看Demo的朋友,直接看API Demo那个程序就可以了,不用到处去找。里面分开不同功能,实现了不同的类。可以根据需要查看具体代码。
相关文章:
Edited by mythou
原创博文,转载请标明出处:在近期的练手项目中,我们使用到了Android Fragment技术。在应用的交互中,我可能需要实现:
从当前的fragment跳转到另一个fragment
从当前的fragment跳转到一个activity中
从当前的activity跳转到一个fragment中
网上提供的思路较多,这里总结了一套自己的方法。
一、从当前的fragment跳转到另一个fragment
1.在相应fragment全局中声明fragment管理对象及事务对象。
// Fragment管理对象
private FragmentM
private FragmentT
2.在OnCreate方法中初始化fragment管理对象
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
manager = getFragmentManager();
3.从 FragmentManager 获得一个FragmentTransaction实例
MyJDEditFragment myJDEditFragment = new MyJDEditFragment();
ft = manager.beginTransaction();
//当前的fragment会被myJDEditFragment替换
ft.replace(R.id.realtabcontent, myJDEditFragment);
ft.addToBackStack(null);
ft.commit();
那么如何在fragment切换的时候还可以传递参数呢?
我们可以使用setArguments()方法绑定一个bundle对象传递到另外一个fragment中。
myJDEditFragment.setArguments(bundle);
在另外一个fragment中(myJDEditFragment)使用getArguments()可以拿到bundle对象。
二、从当前的fragment跳转到一个activity中
由于fragment可以使用 getActivity() 访问Activity实例,所以这一步实现很简单。
intent=new Intent(getActivity(), UserLoginActivity.class);
startActivity(intent);
三、从当前的activity跳转到一个fragment中
如果是从fragment跳转到activity中,然后想从这个activity中再跳转回fragment,这时直接finish这个activity即可。
如果需求是这样的:
在“更多”页面里点击“账号管理”弹出一个activity,处理完这个activity后我们要跳转到”我的京东“中,该如何实现呢?
1、 在对应activity中使用意图跳转到MainActivity中,这里通过意图塞入了一个标识符(更严谨的方式是通过请求码和结果码实现)。
// 登录成功跳转到我的京东首页
Intent intent = new Intent(UserLoginActivity.this,MainActivity.class);
intent.putExtra(&userloginflag&, 1);
startActivity(intent);
2.在MainActivity的onResume()方法中得到这个标识符,并且切换到相应的Tab即可。
protected void onResume() {
int id = getIntent().getIntExtra(&userloginflag&, 0);
if (id == 1 ) {
mTabHost.setCurrentTab(3);
//3代表”我的京东“所在条目的位置,参考下面的源码即可理解
super.onResume();
附上MainActiviy.java的源码及布局文件activity_main.xml
package com.example.
import android.os.B
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentTabH
import android.support.v4.app.FragmentT
import android.support.v4.view.ViewP
import android.view.LayoutI
import android.view.V
import android.widget.ImageV
import android.widget.T
import android.widget.TabHost.TabS
import android.widget.TextV
import com.example.jds.fragment.CarF
import com.example.jds.fragment.CategoryF
import com.example.jds.fragment.IndexF
import com.example.jds.fragment.MoreF
import com.example.jds.fragment.MyJDIndexF
import com.example.jds.fragment.SettingF
import com.example.jds.util.UserA
public class MainActivity extends FragmentActivity {
/** * ----------------------------------------------- */
public MyJDIndexFragment myJDIndexF
// 更多页面
public MoreFragment moreF
// 设置页面
public SettingFragment settingF
// 声明控件对象
public FragmentTabHost mTabH
// 布局填充器
private LayoutI
// 存放文本的数组
private int tabHostTextArray[] = { R.string.tabhost_index,
R.string.tabhost_category, R.string.tabhost_car,
R.string.tabhost_my_jd, R.string.tabhost_more };
// 存放图标的数组
private int tabHostIconArray[] = { R.drawable.tab_home_index,
R.drawable.tab_home_category, R.drawable.tab_home_car,
R.drawable.tab_home_my_jd, R.drawable.tab_home_more };
// 声明片段对应的数组
private Class fragments[] = { IndexFragment.class, CategoryFragment.class,
CarFragment.class, MyJDIndexFragment.class, MoreFragment.class };
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化布局填充器对象
inflater = LayoutInflater.from(this);
// 查找tabHost对象
mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
// 启动tabHost
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
// 遍历片段
for (int i = 0; i & fragments. i++) {
// 创建一个TabSpec
TabSpec tabSpec = mTabHost.newTabSpec(
getResources().getString(tabHostTextArray[i]))
.setIndicator(getTabItemView(i));
// 加入到TabHost中
mTabHost.addTab(tabSpec, fragments[i], null);
initview();
public View getTabItemView(int i) {
View view = inflater.inflate(R.layout.tab_nav_item, null);
ImageView tab_nav_img = (ImageView) view.findViewById(R.id.tab_nav_img);
TextView tab_nav_text = (TextView) view.findViewById(R.id.tab_nav_text);
// 设置图片及文本
tab_nav_img.setImageResource(tabHostIconArray[i]);
// Toast.makeText(this, tabHostIconArray[i], 1).show();
tab_nav_text.setText(getResources().getString(tabHostTextArray[i]));
/** * fragment */
private void initview() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
moreFragment = new MoreFragment();
myJDIndexFragment = new MyJDIndexFragment();
// ft.add(R.id.realtabcontent, accountManagerFragment);
// ft.add(R.id.realtabcontent, myJDFragment);
settingFragment = new SettingFragment();
/* * ft.add(R.id.realtabcontent, accountManagerFragment); * ft.add(R.id.realtabcontent, myJDFragment); * ft.add(R.id.realtabcontent,myJDIndexFragment); * ft.add(R.id.realtabcontent,) */
ft.commit();
protected void onResume() {
int id = getIntent().getIntExtra(&userloginflag&, 0);
if (id == 1 ) {
mTabHost.setCurrentTab(3);
super.onResume();
&LinearLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&
android:background=&#DDDDDD&
tools:context=&${relativePackage}.${activityClass}& &
&FrameLayout
android:id=&@+id/realtabcontent&
android:layout_width=&match_parent&
android:layout_height=&0dp&
android:layout_weight=&1&/&
&android.support.v4.app.FragmentTabHost
android:id=&@android:id/tabhost&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:background=&@drawable/bg_tabhost&&
&FrameLayout
android:id=&@android:id/tabcontent&
android:layout_width=&0dp&
android:layout_height=&0dp&
android:layout_weight=&0&/&
&/android.support.v4.app.FragmentTabHost&
&/LinearLayout&Android入门之Fragment用法
本文翻译自Android developer网站上面,原文参考:
&&&&&当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块。在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变。在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类。Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期。
多个Fragment可以放在一个Activity中(所以上面讲到类似一个嵌套Activity),而这个类可以对这些Fragment进行配置以适应不同的屏幕尺寸(比如平板和手机)。
下面将向您讲述如何创建通过Fragment向用户提供一个动态的体验,并且还可以针对不同的屏幕尺寸做优化,给用户提供更好的使用体验。该特性可以运行在Android1.6上面(当然需要google库的支持)。(all
while continuing to support devices running versions as old as
Android 1.6.这个真心没搞懂,E文好的同学指点下)
使用Android库
&Android支持库是一个jar文件,使用这个支持库可以让我们在低版本上运行高版本的特性(比如Fragment并非1.6的特性,但是通过库的引入,我们可以将包含fragment的程序运行在1.6上面,保证程序兼容性)。
1. 通过SDK Manager下载Android Support Package。
在项目代码顶层创建libs文件夹,并将你需要的jar库文件拷贝到libs里面去。
3. 更新manifest文件,设置如下
android:minSdkVersion="4" android:targetSdkVersion="15" /&
为了确保没有在旧的系统上面使用新的api特性,却要在使用Fragment的文件中包含如下内容:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
应该声明FragmentActivity(而不是Activity)来包含Fragments。
创建Fragment
&我们可以将Fragment当成是一个独立的Activity,它有自己独立的生命周期、获取单独的触发事件,并且在Activity运行的时候可以动态的移除或者添加Fragment。更有趣的是你可以在其他地方重用这个Fragment。本节将展示通过引入支持库,通过继承Fragment来在低版本(最低为1.6版)上运行包含Fragment的程序,保证程序的兼容性。
创建Fragment类
就像创建Activity类一样,继承Fragment,实现一些生命周期中的关键函数,并且记得把你自己的功能代码放到里面去。创建一个Fragment,必须使用onCreateView()定义他的layout布局文件。实际上这是让一个Fragment能够运行起来的唯一一个回调函数,看看下面的例子:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public class ArticleFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
比Activity简单多了,不是吗。当然,就像Activity一样,Fragment也应该实现其他生命周期中的函数,这样我们才可以实现对他的添加删除。举例来说,当activity收到onPause()方法调用的时候,它里面的Fragment同样会被调用到onPause(),所以看好机会,在Fragment里面的onPause()里面放入你写的代码吧。
更详细的Fragment请参考。
使用XML将Fragment添加到一个Activity中
&当重用Fragment的时候,每一个实例化的Fragment必须依附于一个父FragmentActivity,我们可以通过在这个父活动的布局文件xml中定义fragment。
下面是一个将两个Fragment添加到一个活动中的例子
res/layout-large/news_articles.xml:
xmlns:android="/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"&
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" /&
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" /&
看到没有,其实跟一般的添加edittext空间没有任何区别,很简单吧。
Tip:&想知道如何创建支持更多屏幕尺寸的布局,
下面就是怎么使用这个布局的代码了:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
Note:通过在xml中定义fragment的方式,我们不能在运行时移除fragment。如果我们想要通过切换fragments来跟用户有更好的互动,那么就需要在activity启动的时候定义fragment了。
创建更灵活的UI(进阶应用)
&当我们针对各种不同屏幕尺寸的设备设计应用程序的时候,我们可以在不同的布局文件中重用fragments来让客户体验最优化。
比如在平板和手机上,当使用fragment时,表现可能就完全不一样。平板上面我们可以将前后的两个Fragment都显示在屏幕上(因为屏幕空间足够显示了,而且不至于让屏幕空间太空),而在手机上这两个Fragment只能进行切换显示了,因为手机屏幕空间太小,只能够一次显示一屏。图片如下:
&我们可以用类FragmentManager提供一些方法,在运行时对activity中的一些fragments进行添加、移除、覆盖操作,来提供给客户一个动态的更优的体验。
在运行时添加一个Fragment到Activity
上面一节的在activity的布局文件(layout
xml)中添加Fragment的方法我们已经知道了。现在我们将学习另外一种方式,这种方式允许我们在运行时动态的显示和隐藏fragment。为了达到在activity中动态管理Fragment,我们需要用到FragmentManager,并且通过它创建FragmentTransaction(提供针对Fragment操作的一些列api,add/attach/detach/hide等)。
&如果需要在activity中动态的移除或者替换fragments,我们就需要在onCreate函数中将初始化的fragments加入到该activity中。在处理Fragments时,特别是在运行中动态加入的fragments,有一个很重要的规则就是fragment必须有一个容器View,来容纳fragments的layout布局。
下面的layout是针对前面一节内容的替代,每次只显示一个fragment。为了替换当前的fragment,这个activity的layout必须包含一个FrameLayout用来当做fragment容器。
注意:该布局文件文件名是跟上节一样,但是layout文件夹并没有large修饰,所以你懂的。(如果不懂的话也不要紧。解释:因为没有large修饰,所以这个layout是用在比large小的屏幕上,这样屏幕每次只能显示一个fragment了,不能像上图的平板那样显示两个fragment)。
res/layout/news_articles.xml:
xmlns:android="/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
在你的activity内,用getSupportFragmentManager()函数获取FragmentManager。使用beginTransaction创建一个FragmentTransaction,并且调用add()函数添加一个Fragment。我们可以用FragmentTransaction执行多次fragment相关的操作,当我们准备切换的时候,调用函数call()就可以了。
下面就是将一个fragment加入一个layout中:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
// Check that the activity is using the layout version with
// the fragment_container FrameLayout
if (findViewById(R.id.fragment_container) != null) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null) {
// Create an instance of ExampleFragment
HeadlinesFragment firstFragment = new HeadlinesFragment();
// In case this activity was started with special instructions from an Intent,
// pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras());
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
因为是在运行时加入到FrameLayout容器中,并不是写死在xml中,所以activity能够移除、替换该fragment。
如何在两个fragment间切换
替换fragment的过程跟add差不错,区别就是一个是replace()函数,一个是add()函数。时刻要注意的是当执行fragment操作,比如替换或者移除一个fragment,用户经常的操作是回退(backward)或者还原(undo)操作。为了支持用户的这些操作,我们要在commit()一个FragmentTransaction之前先调用函数addToBackStack()函数。
注意:当移除或者替换一个fragment,并且将这个操作放入back
stack(回退堆栈?),当fragment被移除的时候,fragment是停止的(并非销毁)。如果用户要回退,会从堆栈中取一个fragment并且重启(restart)它。如果没有加入back
stack,当移除或者替换的时候,这个fragment就直接被销毁了。
切换fragment如下:
// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
addToBackStack()里面的有一个可选的String参数,该参数在需要使用FragmentManager.BackStackEntry类的APIs的时候需要用到。
Fragment间通信
&为了重用Fragment
UI,我们就需要将该Fragment建立成一个可以自包含(自闭)的系统,拥有自己的layout和行为。一旦定义了这些可重用的fragments,就可以将他们绑定到一个activity上,实现全部的活动UI。很多时候我们想要在两个fragments间进行通信(例如根据用户输入改变内容),所有的Fragment间通信都是通过他们所依附的Activity,他们之间永远不能够直接通信。
定义一个接口
为了允许一个Fragment跟包含他的Activity通信,我们可以在Fragment类中定义一个接口,并且在Activity内实现。Fragment在onAttach()函数里面捕获接口实现,并且调用接口方法和Activity通信。(上面都说了Fragment间只能通过Activity进行通信了。)
看看下面的Fragment和Activity通信的例子:
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
现在Fragment可以通过onArticleSelected()函数,将消息传递到到Activity中。通过使用OnHeadlineSelectedListener的实例达到传递的目的。
例如:下面的例子中,当点击一个列表的元素的时候,fragment中的一个方法被调用。Fragment使用mcallback这个实例化的东东
,将该事件传递给它所依附的父Activity。
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
mCallback.onArticleSelected(position);
为了从Fragment中接受事件消息,父activity必须实现fragment类中定义的几个接口。示例如下:
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
传递消息到Fragment中
宿主Activity可以可以通过findFragmentById()函数获取Fragment实例,然后通过访问fragments的共有函数来将消息传递给Fragments。
在下面的实例中,宿主类将在回调函数中获取的信息传递到另外一个显示这些数据的Fragment中:
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
if (articleFrag != null) {
// If article frag is available, we're in two-pane layout...
// Call a method in the ArticleFragment to update its content
articleFrag.updateArticleView(position);
// Otherwise, we're in the one-pane layout and must swap frags...
// Create fragment and give it an argument for the selected article
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 fragment多次oncreate 的文章

 

随机推荐