2013-04-18 2 views
0

Я создал FragmentActivity с Eclipse, которые показывают ActionBar с вкладками. На первой вкладке я показываю фрагмент со списком, а на следующей вкладке - фрагмент с текстом. Затем я хочу, чтобы, когда я выбрал один элемент первой вкладки, измените второй фрагмент на другой фрагмент списка. Вот мой код:Как обновить фрагмент на вкладке viewpager?

TabActivity создатель Затмения и меня:

public class TabActivity extends FragmentActivity implements ActionBar.TabListener { 

static final int NUM_TABS = MyTab.values().length; 

public enum MyTab{ 
    Categorias(0), Productos(1); 

    private final int index; 

    MyTab(int i) { 
     this.index = i; 
    } 
} 


SectionsPagerAdapter mSectionsPagerAdapter; 

ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pedido); 

    // Set up the action bar. 
    final ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    mSectionsPagerAdapter = new SectionsPagerAdapter(
      getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 


    // When swiping between different sections, select the corresponding 
    // tab. We can also use ActionBar.Tab#select() to do this if we have 
    // a reference to the Tab. 
    mViewPager 
      .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
       @Override 
       public void onPageSelected(int position) { 
        actionBar.setSelectedNavigationItem(position); 
       } 
      }); 

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
     actionBar.addTab(actionBar.newTab() 
       .setText(mSectionsPagerAdapter.getPageTitle(i)) 
       .setTabListener(this)); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.pedido, menu); 
    return true; 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, 
     FragmentTransaction fragmentTransaction) { 
    mViewPager.setCurrentItem(position); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, 
     FragmentTransaction fragmentTransaction) { 

} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 

} 

/** 
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
* one of the sections/tabs/pages. 
*/ 
public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    private FragmentManager mFragmentManager; 
    private TextoFragment mTextoFragment; 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
     mFragmentManager = fm; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return TabFragment.nuevoFragment(position); 
    } 

    @Override 
    public int getCount() { 
     return NUM_TABS; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (MyTab.values()[position]) { 
     case Categorias: 
      return getString(R.string.title_categorias).toUpperCase(l); 
     case Productos: 
      return getString(R.string.title_productos).toUpperCase(l); 
     } 
     return ""; 
    } 
} 

/** 
* A dummy fragment representing a section of the app, but that simply 
* displays dummy text. 
*/ 
public static class TabFragment extends Fragment { 
    /** 
    * The fragment argument representing the section number for this 
    * fragment. 
    */ 
    public static final String ARG_SECTION_NUMBER = "section_number"; 

    static Fragment nuevoFragment(int position) { 

     Fragment f; 
     Bundle args = new Bundle(); 
     switch (Pestaña.values()[position]) { 
     case Categorias: 
      f = new ListaFragment(); 
      args.putInt("tipoObjeto", TipoObjeto.Categoria.ordinal()); 
      break; 
     case Productos: 
      if (EstadoHT.categoriaActual == null) { 
       f = new TextoFragment(); 
       args.putString(TextoFragment.ARG_MENSAJE, 
         "Elija primero una categoría"); 
      } else { 
       f = new ListaFragment(); 
       args.putInt(ListaFragment.ARG_TIPO_OBJETO, 
         TipoObjeto.Producto.ordinal()); 
      } 
      break; 
     default: 
      f = new TabFragment(); 
      args = new Bundle(); 
      args.putInt(TabFragment.ARG_SECTION_NUMBER, position); 
     } 
     f.setArguments(args); 
     return f; 
    } 

    private View lanzarEstadoPedido(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tab_estado_pedido, 
       container, false); // Muestra el layout 

     TextView lblMesa = (TextView) rootView.findViewById(R.id.lblMesa); 
     lblMesa.setText("Nada"); 
     return rootView; 
    } 

    public TabFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     int valorPestaña = getArguments().getInt(ARG_SECTION_NUMBER, 0); 
     switch (MyTab.values()[valorPestaña]) { 

     case Pedido: 
      return lanzarEstadoPedido(inflater, container, 
        savedInstanceState); 

     default: 
      return null; 
     } 
        } 

    } 
} 

В ListaFragment:

public void onItemClick(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 
      Intent dato = new Intent(); 
      IObjetoHT o = (IObjetoHT) lvlista.getItemAtPosition(position); 
      switch (tipo) { 
      case Categoria: 
       App.categoriaActual = (Categoria) o; 
       TabActivity actPedido = (TabActivity) getActivity(); 
       ActionBar actionBar = actPedido.getActionBar(); 
               actPedido.mViewPager.setCurrentItem(TabActivity.MyTab.Productos.ordinal()); 

       break; 
      case Producto: 

       break; 
      default: 
       dato.putExtra(ARG_OBJETO_A_DEVOLVER, o); 
       act.setResult(act.RESULT_OK, dato); 
       act.finish(); 
      } 

Тогда из ListaFragment я хочу загрузить второй фрагмент вкладки .. это возможно?

+0

Отъезд http://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpager – Catherine

+0

@Catherine Я проверил, но это не helo me: S Wath ответит, что вы думаете, что может мне помочь в вашей ссылке? – Millas

+0

Я думал, что вы захотите заменить фрагмент в своем viewpager при определенных условиях? – Catherine

ответ

0

Вы можете использовать диспетчер фрагментов, чтобы отслеживать фрагменты, добавляемые в ваш вкладку TabPagerAdapter.

public class MainActivity extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TabAdapter = new TabPagerAdapter(getSupportFragmentManager(), context); 
     Tab = (ViewPager)findViewById(R.id.pager); 
     Tab.setOnPageChangeListener(
       new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar = getActionBar(); 
         actionBar.setSelectedNavigationItem(position); 
         if(position == 1) 
         { 
          android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 

          **MYACTIVITY fragment = (MYACTIVITY) fragmentManager.findFragmentByTag("YOUR TAG 1");** 
          fragment.get_recent(); 
          Toast.makeText(context, "im visible", Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 

     Tab.setAdapter(TabAdapter); 
     actionBar = getActionBar(); 
     //Enable Tabs on Action Bar 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     actionBar.addTab(actionBar.newTab().setText("TAB NAME 1").setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab().setText("TAB NAME 2").setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab().setText("TAB NAME 3").setTabListener(tabListener)); 


     android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().add(TabAdapter.getItem(0), "YOUR TAG 1").commit(); 
     fragmentManager.beginTransaction().add(TabAdapter.getItem(1), "YOUR TAG 2").commit(); 
     fragmentManager.beginTransaction().add(TabAdapter.getItem(2), "YOUR TAG 3").commit(); 
    } 

public class TabPagerAdapter extends FragmentStatePagerAdapter { 

    private Context context; 

    public TabPagerAdapter(FragmentManager fm, Context context) { 
     super(fm); 
     this.context = context; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Fragment getItem(int i) { 
     switch (i) { 
     case 0: 
      return new YOURACTIVITY1(); 
     case 1: 
      return new YOURACTIVITY2(); 
     case 2: 
      return new YOURACTIVITY3(); 
     } 

     return null; 
    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return 3; //No of Tabs 
    } 

} 

Будьте осторожны, если вы используете ActionBarSherlock потому, что вам нужно явно указать свой помощью android.support.v4.app.FragmentManager.

Смежные вопросы