Fragment
をViewPager
の別のものに置き換えるときに問題が発生します。ViewPagerでフラグメントを置き換える
現状
私はViewPager
3でページを持っているが、それぞれがFragment
です。最初のページではListFragment
( "FacturasFragment")内にListView
があります。そのリストの項目をクリックすると、そのイベントを処理する方法はonListItemClick
です。
リスト項目をクリックすると、私は
- を欲しい、私は別の
Fragment
(「DetallesFacturaFragment」、請求書の詳細が含まれています)と(請求書のリストが含まれています)ListFragment
を交換したいです。 - "DetallesFacturaFragment"に入って、Backを押すと、
Button
がListFragment
に戻るはずです。 - ページ間のスクロールは、最初に表示される
Fragment
を変更しないでください。最初のページに「DetallesFacturaFragment」があり、2ページ目までスクロールすると、最初のページに戻ると「DetallesFacturaFragment」が表示されます。
コード
FragmentActivity
public class TabsFacturasActivity extends SherlockFragmentActivity {
private MyAdapter mAdapter;
private ViewPager mPager;
private PageIndicator mIndicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
}
private static class MyAdapter extends FragmentPagerAdapter {
private String[] titles = { "VER FACTURAS", "VER CONSUMO", "INTRODUCIR LECTURA" };
private final FragmentManager mFragmentManager;
private Fragment mFragmentAtPos0;
private Context context;
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
mFragmentManager = fragmentManager;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0: // Fragment # 0
return new FacturasFragment();
case 1: // Fragment # 1
return new ConsumoFragment();
case 2:// Fragment # 2
return new LecturaFragment();
}
return null;
}
@Override
public int getCount() {
return titles.length;
}
@Override
public int getItemPosition(Object object)
{
if (object instanceof FacturasFragment && mFragmentAtPos0 instanceof DetallesFacturaFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
}
}
ListFragment
public class FacturasFragment extends ListFragment {
private ListView lista;
private ArrayList<TuplaFacturaWS> facturas;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.activity_facturas, container, false);
facturas = myApplication.getFacturas();
lista = (ListView) view.findViewById(id.list);
MyAdapter myAdaptador = new MyAdapter(this, facturas);
setListAdapter(myAdaptador);
return view;
}
public void onListItemClick (ListView l, View v, int position, long id) {
myApplication.setFacturaActual(position);
mostrarDatosFactura();
}
private void mostrarDatosFactura() {
final DetallesFacturaFragment fragment = new DetallesFacturaFragment();
FragmentTransaction transaction = null;
transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.pager, fragment); //id of ViewPager
transaction.addToBackStack(null);
transaction.commit();
}
private class MyAdapter extends BaseAdapter {
private final FacturasFragment actividad;
private final ArrayList<TuplaFacturaWS> facturas;
public MyAdapter(FacturasFragment facturasActivity, ArrayList<TuplaFacturaWS> facturas) {
super();
this.actividad = facturasActivity;
this.facturas = facturas;
}
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = actividad.getLayoutInflater(null);
View view = inflater.inflate(R.layout.list_row, null, true);
//Set data to view
return view;
}
@Override
public int getCount() {
return facturas.size();
}
@Override
public Object getItem(int pos) {
return facturas.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
private OnClickListener checkListener = new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
};
}
}
フラグメント
現在、リスト項目をクリックすると、最初のページに白い表示が表示されます。私は確認して、 "DetallesFacturaFragment"のonCreateView
メソッドが実行されますが、そのページに何も表示されません。
初めてリストアイテムをクリックすると、その白い画面が表示されます。しかし、リストに戻った後、白い画面を表示するためのリスト項目を2回クリックする必要があります。
私はグーグルで多くの質問を見てきましたが、完成したコードで解決された人は見つかりませんでした。
ネストされたフラグメントを使用します。最初のページはホルダーフラグメントになります。このフラグメントでは、作成時に現在の 'ListFragment'を最初に追加します。リストアイテムをクリックすると、ネストされた 'ListFragment'を同じホルダーフラグメントのネストされた詳細フラグメントに置き換えます。その詳細フラグメントに 'setRetainInstance()'を使わないでください。 – Luksprog
ネストされたフラグメントを使用する理由私はそれについて知らない。 – Lyd
あなたは単に 'ViewPager'にフラグメントを置くことはできません。ネストされたフラグメントについて読むと、あまりにも扱いにくいものではありません。 – Luksprog