所以基本上,我有一个简单的 Fragment,它使用 AsyncTask 从 URL 下载位图,然后在 ImageView 中显示它。
这是片段的代码:
public class TestFragment extends Fragment {
public TestFragment () {}
private String pictureUrl = "https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn1/532762_10150739418088211_1186720820_n.jpg";
private TextView sampleText;
private ImageView sampleImage;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_view, container, false);
String textToSet = "Section Three";
sampleText = (TextView) root.findViewById(R.id.textView1);
sampleText.setText(textToSet);
sampleImage = (ImageView) root.findViewById(R.id.imageView1);
DownloadImageTask task = new DownloadImageTask(pictureUrl, root, sampleImage.getId());
task.execute();
return root;
}
}
同一片段显示 3 次,每个选项卡在 ActionBar 内显示一次。我遇到的问题是,每次用户选择不同的选项卡时,前一个选项卡都会被破坏,当用户导航回原始选项卡时,需要重新下载内容。我想确保消耗最少的资源(保存数据和有价值的开销处理)。
这是片段容器活动:
public class LayoutContainer extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_container);
if (savedInstanceState != null) {
return;
}
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab = actionBar.newTab()
.setText(R.string.title_section1)
.setTabListener(new TabListener<TestFragment>(
this, "one", TestFragment.class));
actionBar.addTab(tab);
tab = actionBar.newTab()
.setText(R.string.title_section2)
.setTabListener(new TabListener<TestFragment>(
this, "two", TestFragment.class));
actionBar.addTab(tab);
tab = actionBar.newTab()
.setText(R.string.title_section3)
.setTabListener(new TabListener<TestFragment>(
this, "three", TestFragment.class));
actionBar.addTab(tab);
}
public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
public TabListener(Activity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName());
}
ft.replace(android.R.id.content, mFragment, mTag);
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.addToBackStack(null);
ft.commit();
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
我目前已将其设置为在OnTabSelected()方法上调用ft.replace(),但我之前曾尝试使用ft.add()。我当前在 OnTabUnselected() 中的ft.addToBackStack()调用也是如此,我最初将它设置为简单地调用ft.detach()但这与我描述为我的问题的事情相同。它以这种方式加载,但每次都必须下载图像。
现在,我尝试调用addToBackStack()但应用程序强制关闭,说明 FragmentTransaction 不能添加到后台堆栈。我过去也尝试过离线缓存图像,为了避免数据消耗,应用程序仍然需要从本地 URI 解析图像并使用处理能力。
我可以尝试任何想法吗?
仅供参考,是的,我知道同一个片段在所有三个选项卡上加载同一个图像。这只是一个测试项目,旨在帮助我更好地了解 Fragments 的生命周期。