我面臨的問題如下: 在主屏幕上,我有3個按鈕:配置,主要,設置。當從其他片段返回時不顯示(恢復)Viewpager片段
- 單擊每個按鈕時,將顯示相應的片段以在FrameLayout中擴展布局。
- 當用戶在Config或Setting Fragment中時,可以使用onBackpressed返回到主片段,或者單擊Main按鈕。當用戶在主片段中時,如果用戶點擊返回,彈出窗口顯示確認退出。
在主片段中,我放了一個viewpager。在這個viewpager裏面,我放了2個其他片段,每個片段都包含一個圖像網格(我還使用了圓圈指示器來查看頁面底部的變化)。爲簡單起見,Config Fragment和Setting Fragment僅在中心顯示文本。當應用程序啓動時,通常顯示主要片段,當我點擊Setting或Config按鈕時,它通常顯示相應的片段。問題是當點擊後退按鈕(在Android上)時,它會返回到主片段,但viewpager內沒有片段。它顯示空的屏幕。
也許我錯了,當過程會從配置回/設置片段主要片段。如果主要片段只是在沒有viewpager的情況下膨脹某個佈局,則問題不會發生。當從配置/設置片段返回主片段時如何恢復viewpager的狀態?我附上我的代碼,以便您可以給我更明確的答案。非常感謝你的回答。
package com.example.testfragmentviewpager;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.FrameLayout;
import com.example.viewpageindicator.CirclePageIndicator;
import com.example.viewpageindicator.PageIndicator;
public class MainActivity extends FragmentActivity {
Fragment configFragment;
Fragment settingFragment;
Fragment mainItemsFragment;
FrameLayout frmLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
if (savedInstanceState == null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
frmLayout = (FrameLayout) findViewById(R.id.frame_cotainer);
mainItemsFragment = new MainItemsFragment();
ft.add(R.id.frame_cotainer, mainItemsFragment, "mainItems").commit();
}
addListener(R.id.btnConfig);
addListener(R.id.btnMain);
addListener(R.id.btnSetting);
}
public void addListener(int buttonID) {
final Button btn = (Button) findViewById(buttonID);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showFragment(btn);
}
});
}
public void showFragment(View v) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
switch (v.getId()) {
case R.id.btnConfig:
if (configFragment == null) {
configFragment = new ConfigListFragment();
}
else if (configFragment.isVisible())
return;
if (getCurrentEntriesInBackStack() == 0) {
ft.addToBackStack("mainItems");
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.replace(R.id.frame_cotainer, configFragment, "config");
break;
case R.id.btnMain:
if (mainItemsFragment == null)
mainItemsFragment = new MainItemsFragment();
if (getCurrentEntriesInBackStack() == 0)
return;
else {
if (configFragment != null && configFragment.isVisible()) {
ft.detach(configFragment);
configFragment = null;
}
if (settingFragment != null && settingFragment.isVisible()) {
ft.detach(settingFragment);
settingFragment = null;
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
removeFromContainer(ft);
callPopBackStack();
return;
}
case R.id.btnSetting:
if (settingFragment == null)
settingFragment = new SettingFragment();
else if (settingFragment.isVisible())
return;
if (getCurrentEntriesInBackStack() == 0) {
ft.addToBackStack("mainItems");
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.replace(R.id.frame_cotainer, settingFragment, "setting");
break;
default:
break;
}
ft.commit();
}
private int getCurrentEntriesInBackStack() {
FragmentManager fm = getSupportFragmentManager();
return fm.getBackStackEntryCount();
}
private boolean callPopBackStack() {
FragmentManager fm = getSupportFragmentManager();
boolean result = fm.popBackStackImmediate();
return result;
}
private void removeFromContainer(FragmentTransaction ft) {
if (configFragment != null && configFragment.isVisible()) {
ft.detach(configFragment);
configFragment = null;
}
if (settingFragment != null && settingFragment.isVisible()) {
ft.detach(settingFragment);
settingFragment = null;
}
ft.commit();
}
public static class ConfigListFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.layout_config, container, false);
return v;
}
}
public static class SettingFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.layout_setting, container, false);
return v;
}
}
public static class MainItemsFragment extends Fragment {
private MyPagerAdapter adapter;
private ViewPager viewpager;
private PageIndicator mIndicator;
View rootView;
private class setAdapterTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
viewpager.setAdapter(adapter);
mIndicator = (CirclePageIndicator) rootView.findViewById(R.id.indicator);
mIndicator.setViewPager(viewpager);
viewpager.setCurrentItem(0);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.mainscreen_layout, container, false);
adapter = new MyPagerAdapter(getFragmentManager());
viewpager = (ViewPager) rootView.findViewById(R.id.myviewpager);
new setAdapterTask().execute();
return rootView;
}
}
public static class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
if (index == 0) {
return new MainFragment1();
}
else {
return new MainFragment2();
}
}
@Override
public int getCount() {
return 2;
}
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
removeFromContainer(ft);
if (fm.popBackStackImmediate()) {
return;
}
else {
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("Confirm Exit");
dlg.setMessage("Do you want to exit?").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MainActivity.this.finish();
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alertDlg = dlg.create();
alertDlg.show();
}
}
}
感謝Marco對您的建議。我剛剛將Android支持庫更新爲Re。 11並將getChildFragmentManager()傳遞給viewpager的構造函數,但仍然沒有運氣。當我從設置/配置片段返回時,主片段中的viewpager仍爲空。用戶從設置/配置片段I返回時的過程如下(詳見嵌入代碼showFragment的功能): 1 /設置/配置片段的分離UI; 2 /從背部堆棧獲取主要碎片 從背部堆棧獲取主要碎片是否出錯? – zungnv
這適用於我,投票:) :) –
爲我工作!謝謝你,兄弟! – NemesisDoom