3
我的想法是在AsyncTask中创建新片段,然后在onPostExecute上将它与显示的进度条片段交换。我的问题是片段从不交换,因此它保留在进度条片段中。这不可能做到吗?这是一个坏方法吗?我应该在DetailFragment里面有进度条吗? (会有很多与进度条片段在其中)是否有可能在后台线程中交换片段
@Override
protected void onStart() {
super.onStart();
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, new ProgressBarFragment()).commit();
TestSwapFragment d = new TestSwapFragment();
d.execute(data);
}
class TestSwapFragment extends AsyncTask<FragmentData, Void, MyFragment> {
FragmentData data = null;
@Override
protected MyFragment doInBackground(FragmentData... params) {
try {
Thread.sleep(15000); // Simulate the long running method below
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data = params[0];
DetailFragment df= new DetailFragment();
df.ExecuteFragment(this.data); // Long running
return df;
}
@Override
protected void onPostExecute(MyFragment result) {
super.onPostExecute(result);
if (this.data.Position == FragmentPosition.PaneOne)
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, result).commit();
else
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame2, result).commit();
}
}
为什么很重要,以使数据parcelable? (重写后,我意识到我需要传入一个特定的类)为什么不只是创建一个方法,setData()这是一个变量? MyData _data; .. public void setData(MyData data){_data = data; } – Patrick
我对答案说。这是因为片段的生命周期。如果片段对象被销毁,但系统稍后需要相同的片段(后退按钮,旋转,添加到管理器中的布局片段等),系统将传递相同的Bundle到片段,以便可以重新构建。如果你只是创建一个这样的函数,这将不会发生,你的片段将在这些条件下有一个空数据。 – Budius