2013-09-03 20 views
49

FragmentViewPagerの別のものに置き換えるときに問題が発生します。ViewPagerでフラグメントを置き換える

現状

私はViewPager 3でページを持っているが、それぞれがFragmentです。最初のページではListFragment( "FacturasFragment")内にListViewがあります。そのリストの項目をクリックすると、そのイベントを処理する方法はonListItemClickです。

リスト項目をクリックすると、私は

  • を欲しい、私は別のFragment(「DetallesFacturaFragment」、請求書の詳細が含まれています)と(請求書のリストが含まれています)ListFragmentを交換したいです。
  • "DetallesFacturaFragment"に入って、Backを押すと、ButtonListFragmentに戻るはずです。
  • ページ間のスクロールは、最初に表示される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回クリックする必要があります。

私はグーグルで多くの質問を見てきましたが、完成したコードで解決された人は見つかりませんでした。

+1

ネストされたフラグメントを使用します。最初のページはホルダーフラグメントになります。このフラグメントでは、作成時に現在の 'ListFragment'を最初に追加します。リストアイテムをクリックすると、ネストされた 'ListFragment'を同じ​​ホルダーフラグメントのネストされた詳細フラグメントに置き換えます。その詳細フラグメントに 'setRetainInstance()'を使わないでください。 – Luksprog

+0

ネストされたフラグメントを使用する理由私はそれについて知らない。 – Lyd

+0

あなたは単に 'ViewPager'にフラグメントを置くことはできません。ネストされたフラグメントについて読むと、あまりにも扱いにくいものではありません。 – Luksprog

答えて

45

多くの時間を費やした後、私はthat answerにコードを修正する正しいソリューションを見つけました。

それは別のものでViewPagerの最初のページでFragmentを置き換え、そしてあなたが戻って二Fragmentから戻ると、最初のFragmentが正しく表示されます。最初のページに表示されるFragmentとは関係ありません。あるページから別のページにスワイプすると、Fragmentは変更されません。ここで

は私のコードです:

FragmentActivity

public class TabsFacturasActivity extends SherlockFragmentActivity { 

    public void onBackPressed() { 
     if(mPager.getCurrentItem() == 0) { 
      if (mAdapter.getItem(0) instanceof DetallesFacturaFragment) { 
       ((DetallesFacturaFragment) mAdapter.getItem(0)).backPressed(); 
      } 
      else if (mAdapter.getItem(0) instanceof FacturasFragment) { 
       finish(); 
      } 
     } 
    } 

    private static class MyAdapter extends FragmentPagerAdapter { 

     private final class FirstPageListener implements 
     FirstPageFragmentListener { 
      public void onSwitchToNextFragment() { 
       mFragmentManager.beginTransaction().remove(mFragmentAtPos0) 
       .commit(); 
       if (mFragmentAtPos0 instanceof FacturasFragment){ 
        mFragmentAtPos0 = new DetallesFacturaFragment(listener); 
       }else{ // Instance of NextFragment 
        mFragmentAtPos0 = new FacturasFragment(listener); 
       } 
       notifyDataSetChanged(); 
      } 
     } 

     private String[] titles = { "VER FACTURAS", "VER CONSUMO", "INTRODUCIR LECTURA" }; 
     private final FragmentManager mFragmentManager; 
     public Fragment mFragmentAtPos0; 
     private Context context; 
     FirstPageListener listener = new FirstPageListener(); 

     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 
       if (mFragmentAtPos0 == null) 
       { 
        mFragmentAtPos0 = new FacturasFragment(listener); 
       } 
       return mFragmentAtPos0; 

      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; 
      } 
      if (object instanceof DetallesFacturaFragment && 
        mFragmentAtPos0 instanceof FacturasFragment) { 
       return POSITION_NONE; 
      } 
      return POSITION_UNCHANGED; 
     } 

    } 

} 

FirstPageFragmentListener

public interface FirstPageFragmentListener { 
    void onSwitchToNextFragment(); 
} 

FacturasFragment(FirstFragment)

public class FacturasFragment extends ListFragment implements FirstPageFragmentListener { 

    static FirstPageFragmentListener firstPageListener; 

    public FacturasFragment() { 
    } 

    public FacturasFragment(FirstPageFragmentListener listener) { 
     firstPageListener = listener; 
    } 

    public void onListItemClick (ListView l, View v, int position, long id) { 
     firstPageListener.onSwitchToNextFragment(); 
    } 
} 

DetallesFacturaFragment(SecondFragment)

public class DetallesFacturaFragment extends SherlockFragment { 

    static FirstPageFragmentListener firstPageListener; 

    public DetallesFacturaFragment() { 
    } 

    public DetallesFacturaFragment(FirstPageFragmentListener listener) { 
     firstPageListener = listener; 
    } 

    public void backPressed() { 
     firstPageListener.onSwitchToNextFragment(); 
    } 
} 
+2

githubや他の人のチュートリアルやサンプルを投稿できます@Lyd –

+2

あなたは揺れます!!ソリューションのおかげで..(+1).. Bt私は質問がある、なぜこれは、ビューパージャーを使用しているときのように動作しますか? –

+1

私は本当に知りません...私はそれが働くことがわかるまで、私はそれで何時間も過ごしました! – Lyd

0

Androidはフラグメントにデフォルト以外のコンストラクタを使用していないことを示唆しているマイナーな問題を解決するには。 FacturasFragmentで

:あなたはこのような何かにコンストラクタを変更する必要がありDetallesFacturaFragmentで

mFragmentAtPos0 = FacturasFragment.createInstance(listener); 

public static DetallesFacturaFragment createInstance(FirstPageFragmentListener listener) { 
    DetallesFacturaFragment detallesFacturaFragment= new DetallesFacturaFragment(); 
    detallesFacturaFragment.firstPageListener = listener; 
    return detallesFacturaFragment; 
} 

public static FacturasFragment createInstance(FirstPageFragmentListener listener) { 
    FacturasFragment facturasFragment = new FacturasFragment(); 
    facturasFragment.firstPageListener = listener; 
    return facturasFragment; 
} 

次に、あなたは、このようのgetItem関数からそれを呼び出すことができます

次に、FirstPageListener.onSwitchToNextFragmentから呼び出すことができます()関数は次のようになります。

mFragmentAtPos0 = DetallesFacturaFragment.createInstance(listener); 
関連する問題