2013-08-26 43 views
6

Tôi đang sử dụng trình xem ảnh để vuốt giữa các đoạn và muốn nút quay lại điều hướng đến đoạn đã xem trước đó thay vì kết thúc hoạt động. Xin lỗi nếu đây là bản sao của this question tuy nhiên tôi không tìm thấy câu trả lời rất hữu ích. Rõ ràng onBackPressed cần phải được ghi đè, nhưng tôi không biết làm thế nào để có được và hiển thị các mảnh chính xác. Tôi giả sử rằng tôi nên sử dụng backstack fragmentmanager của, nhưng getSupportFragmentManager().getBackStackEntryCount() luôn luôn trả về 0. Tôi có cần phải tự thêm các mảnh vỡ vào backstack sử dụng FragmentTransaction.addToBackStack()? Nếu vậy, tôi sẽ thêm cái này vào bộ điều hợp ở đâu?Sử dụng backstack và nút quay lại trong viewpager

Đây là mã cho hoạt động của tôi,

public class PagerActivity extends FragmentActivity { 

ArrayList<Sale> sales; 
MyAdapter mAdapter; 
ViewPager mPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent it = getIntent(); 
    this.sales = (ArrayList<Sale>) it.getExtras().get("sales"); 
    int position = it.getExtras().getInt("position"); 

    ActionBar actionBar = getActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 

    setContentView(R.layout.fragment_pager); 
    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    mPager.setCurrentItem(position); 

} 

public class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public int getCount() { 
     return sales.size(); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     SalesThumbFragment frag = new SalesThumbFragment(); 
     return frag.newInstance(sales.get(position)); 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     finish(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.sales_controller, menu); 
    return true; 
} 

@Override 
public void onBackPressed() { 
    if(getSupportFragmentManager().getBackStackEntryCount() != 0) { 
    getSupportFragmentManager().popBackStack(); 
    } else { 

    super.onBackPressed(); 
    } 
} 


} 

Trả lời

0

Nếu bạn sử dụng một trường để theo dõi các chỉ số của các trang trước sử dụng mPager.getCurrentItem() sau mỗi khi người dùng điều hướng tới một đoạn mới, sau đó trong onBackPressed() phương pháp, bạn sẽ có thể gọi mPager.setCurrentItem(previousPage)

Hoặc, nếu người dùng chỉ có thể trang theo thứ tự, sau đó bạn không cần một lĩnh vực nào cả, và bạn chỉ có thể làm mPager.setCurrentItem(mPager.getCurrentItem()-1)

+0

Người dùng có thể điều hướng theo một trong hai hướng để giải pháp thứ hai không hoạt động. Tôi vừa thử triển khai giải pháp đầu tiên bằng cách thêm một 'OnPageChangeListener' và ghi lại các chỉ mục ở đó nhưng hành vi không nhất quán. Đôi khi trang được hiển thị sẽ không thay đổi mặc dù tôi có thể thấy từ nhật ký rằng đoạn tiếp theo đã được khởi tạo. – Igd

+0

Ngoài ra, việc theo dõi các chỉ mục theo cách thủ công cảm thấy giống như một giải pháp 'un-android' cho rằng backstack đã tồn tại cho mục đích này – Igd

+2

Hmm, tôi không chắc tại sao có sự mâu thuẫn đó, nhưng điều quan trọng cần lưu ý là ViewPager thực sự giữ 3 trang được khởi tạo trong bộ nhớ mọi lúc: trang hiện tại, trang trước và trang tiếp theo. Do đó, nếu bạn hiện đang ở trang 2 (trang 1, 2 và 3 hiện đang được khởi tạo) và sau đó chuyển sang trang 3, ví dụ, trang 4 sẽ được khởi tạo và trang 1 sẽ bị xóa. –

1

Tôi có một vấn đề tương tự, đây là cách tôi giải quyết nó. Tôi nghĩ bạn có thể điều chỉnh mã cho vấn đề của mình, nếu tôi hiểu vấn đề của bạn là gì. Tôi đã có một ViewPager với 6 mảnh và muốn theo dõi lịch sử trang và có thể sử dụng nút quay lại để điều hướng ngược trong lịch sử. Tôi tạo đối tượng java.util.Stack<Integer>, thêm số đoạn vào nó (trừ khi bạn sử dụng nút quay lại, xem bên dưới) và ghi đè onBackPressed() để làm cho nó phát đoạn xem cuối cùng thay vì sử dụng ngăn xếp sau, khi ngăn xếp lịch sử của tôi không trống.

Bạn muốn tránh đẩy các yếu tố trên ngăn xếp khi bạn nhấn nút quay lại, nếu không bạn sẽ bị kẹt giữa hai đoạn nếu bạn tiếp tục sử dụng nút quay lại, thay vì thoát ra cuối cùng.

Mã của tôi:

MyAdapter mAdapter; 
ViewPager mPager; 
Stack<Integer> pageHistory; 
int currentPage; 
boolean saveToHistory; 

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

    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager)findViewById(R.id.container); 
    mPager.setAdapter(mAdapter); 
    mPager.setOffscreenPageLimit(5); 

    pageHistory = new Stack<Integer>(); 
    mPager.setOnPageChangeListener(new OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int arg0) { 
      if(saveToHistory) 
       pageHistory.push(Integer.valueOf(currentPage)); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
    saveToHistory = true; 
} 

@Override 
public void onBackPressed() { 
    if(pageHistory.empty()) 
     super.onBackPressed(); 
    else { 
     saveToHistory = false; 
     mPager.setCurrentItem(pageHistory.pop().intValue()); 
     saveToHistory = true; 
    } 
}; 
2

Sử dụng mã này trong lớp Hoạt động Fragment. Đừng quên thêm trả lại đúng;

public boolean onKeyDown(int keyCode, KeyEvent event) { 

    // TODO Auto-generated method stub 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) { 

      mViewPager.setCurrentItem(viewPageSelected - 1); 
      return true; 
     } 

    return super.onKeyDown(keyCode, event); 

} 
8

Trong thư viện hỗ trợ thiết kế mới, tôi sử dụng này
Tôi có cùng một vấn đề và tôi làm theo bước này

Trong hoạt động chính, nơi có 3 mảnh trong ViewPager i tạo ngăn xếp và push và dữ liệu pop.

//private Stack<Integer> stackkk; ==> As i get edit suggestion 
private Stack<Integer> stackkk = new Stack<>(); // Edited 
private ViewPager mPager; 
private int tabPosition = 0; 



    mTabLayout.setupWithViewPager(mPager); 
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      tabPosition = tab.getPosition(); 
      mPager.setCurrentItem(tab.getPosition()); 

      if (stackkk.empty()) 
       stackkk.push(0); 

      if (stackkk.contains(tabPosition)) { 
       stackkk.remove(stackkk.indexOf(tabPosition)); 
       stackkk.push(tabPosition); 
      } else { 
       stackkk.push(tabPosition); 
      } 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
      tabPositionUnselected = tab.getPosition(); 
     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 
     } 
    }); 
} 

và trong onBackPressed trong hoạt động,

@Override 
public void onBackPressed() { 
    if (stackkk.size() > 1) { 
     stackkk.pop(); 
     mPager.setCurrentItem(stackkk.lastElement()); 
    } else { 
    } 
} 
+0

Cảm ơn bạn đã sửa đổi Đề xuất vì tôi đã thay đổi mã của mình biểu mẫu riêng Ngăn xếp stackkk; đến riêng tư Stack stackkk = new Stack <>(); Tạo đối tượng mới mỗi lần. –

0

Tôi đã thực hiện tùy chỉnh ViewPager và thực hiện các chức năng chồng trong đó.

public class CustomViewPager extends ViewPager { 

private Stack<Integer> stack = new Stack<>(); 

@Override 
public void setCurrentItem(int item, boolean smoothScroll) { 
    stack.push(getCurrentItem()); 
    super.setCurrentItem(item, smoothScroll); 
} 

public int popFromBackStack(boolean smoothScroll) { 
    if (stack.size()>0) { 
     super.setCurrentItem(stack.pop(), smoothScroll); 
     return getCurrentItem(); 
    } else return -1; 
} 
Các vấn đề liên quan