更换一个片段,另一个ViewPager [英] Replace one Fragment with another in ViewPager
问题描述
我有一些问题,当我尝试更换一个片段
与另一个在 ViewPager
。
I'm having some problems when I try to replace one Fragment
with another one in a ViewPager
.
现状
我有一个 ViewPager
3页,每一个是片段
。在第一页,我有一个的ListView
在 ListFragment
(FacturasFragment)。当我点击该列表中的一个项目,我用 onListItemClick
方法处理该事件。
I have a ViewPager
with 3 pages, each one is a Fragment
. In first page, I have a ListView
inside a ListFragment
("FacturasFragment"). When I click on an item of that list, I use onListItemClick
method for handle that event.
我要什么
- 在当前列表项被点击时,我想替换
ListFragment
(含发票列表)与另一片段
(DetallesFacturaFragment,包含发票的详细信息)。 - 当我在DetallesFacturaFragment和preSS返回
按钮
,应该回归到ListFragment
。 - 在页面之间滚动不应更改
片段
显示在第一位。这是,如果我在DetallesFacturaFragment第一页,滚动到第二页的时候返回第一个应该继续显示DetallesFacturaFragment。
- When list item is clicked, I want to replace
ListFragment
(contains a list of invoices) with anotherFragment
("DetallesFacturaFragment", contains details of invoice). - When I'm in "DetallesFacturaFragment" and press Back
Button
, should return toListFragment
. - Scrolling between pages should not change
Fragment
displayed in first one. It is, if I'm in first page with "DetallesFacturaFragment" and scroll to second page, when return to first one should continue displaying "DetallesFacturaFragment".
code
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
}
};
}
}
片段的
public class DetallesFacturaFragment extends SherlockFragment {
@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_factura, container, false);
//Set data to view
return view;
}
}
目前,当我点击列表项,白的观点出现在第一页。我已经验证和 onCreateView
执行的DetallesFacturaFragment的方法,但没有出现在该网页上。
At the moment, when I click on list item, white view appears in first page. I've verified and onCreateView
method of "DetallesFacturaFragment" is executed, but nothing appears on that page.
和我第一次点击列表项,充分显示了白屏。但回来到列表之后,我必须点击两次,一个列表项用于显示白色画面。
And first time I click on list item, it shows that white screen. But after coming back to list, I have to click twice to a list item for showing white screen.
我一直在使用Google,并寻找一些很多的问题,但没有找到任何解决了完成code。
I've been googling and looking at some many questions but couldn't find anyone solved with completed code.
推荐答案
在这么多小时花了,我已经找到了正确的解决方案修改code中的这个答案。
After so many hours spent, I've found correct solution modifying code in that answer.
它取代片段
在 ViewPager
第一页与另外一个,如果你从第二返回片段
,第片段
正确显示。无所谓片段
显示在第一页,如果你从一个网页刷到另一个,它不会改变其片段
。
It replaces Fragment
in first page of ViewPager
with another one, and if you return back from second Fragment
, first Fragment
is correctly displayed. Doesn't matter Fragment
displayed in first page, if you swipe from one page to another, it doesn't change its Fragment
.
下面是我的code:
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)
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)
DetallesFacturaFragment (SecondFragment)
public class DetallesFacturaFragment extends SherlockFragment {
static FirstPageFragmentListener firstPageListener;
public DetallesFacturaFragment() {
}
public DetallesFacturaFragment(FirstPageFragmentListener listener) {
firstPageListener = listener;
}
public void backPressed() {
firstPageListener.onSwitchToNextFragment();
}
}
这篇关于更换一个片段,另一个ViewPager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!