2012-11-01 30 views
8

Tôi đang có hai đoạn Frag A và Frag B được hiển thị bằng cách sử dụng trình xem trang. Nếu người dùng đã vuốt từ A sang B, sau đó nhấn nút quay lại (khi ở B) thì người dùng nên chuyển đến A thay vì sắp hết trang xem. Làm thế nào chúng ta có thể đạt được điều này?Làm thế nào để xử lý nút quay lại bằng cách sử dụng máy nhắn tin xem?

Thêm giao dịch vào backstack có vẻ không hữu ích.

Cảm ơn

Trả lời

20

Bạn cần phải ghi đè lên các phương pháp onKeyDown() trong Activity.

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     myViewPager.setCurrentItem(0, true); 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 

Điều này sẽ nắm bắt sự kiện nhấn nút "quay lại" và đưa người dùng đến mục đầu tiên trong ViewPager.

Ngoài ra còn có ViewPager#getCurrentItem() có thể được sử dụng để chỉ quay lại nếu người dùng đã vuốt. Triển khai như sau:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) { 
     myViewPager.setCurrentItem(0, true); 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 

sẽ chỉ đưa người dùng trở lại trang trước nếu người dùng ở trang tiếp theo. Khác, nó sẽ đăng ký "trở lại" bình thường và người dùng sẽ thoát như mong đợi.

Bạn có thể muốn trường hợp người dùng quay trở lại trang trước đó (giả sử bạn có nhiều hơn hai trang). Trong trường hợp đó, bạn muốn thực hiện ViewPager.OnPageChangeListener() và lưu vị trí mỗi khi onPageSelected(int position) được gọi. Nếu bạn thực hiện chúng trong một ngăn xếp, sau đó bạn có thể bật chúng ra mỗi khi người dùng nhấn "trở lại". Khi ngăn xếp trống, hãy thoát khỏi ứng dụng.

EDIT

Như đã trình bày một cách chính xác trong các ý kiến ​​của Jade Byfield, một cách hơi dễ dàng hơn để làm điều này sẽ được sử dụng onBackPressed() trong hoạt động. Điều này sẽ chỉ hoạt động ở cấp API 5+.

@Override 
public void onBackPressed() { 
    if(i_dont_want_to_leave) { 
    myViewPager.setCurrentItem(0, true); 
    } else { 
    super.onBackPressed(); // This will pop the Activity from the stack. 
    } 
} 
+0

Anh ấy cũng có thể ghi đè lênBackPressed không? Hoặc là chỉ cho các API trước đó? –

+0

Sử dụng onKeyDown() hoạt động trên mọi cấp API nền tảng 1+. Ngoài ra, trừ khi tôi đã sử dụng nó sai tất cả cùng, onBackPressed sẽ không ngăn chặn các hoạt động được popped từ ngăn xếp. Nếu bạn trả về 'true' trong' onKeyDown() ', thì đó sẽ là điều duy nhất xảy ra và sự kiện sẽ dừng tầng. – DeeV

+0

Đợi đã. Chỉ có một đống não. Có. Anh ta có thể sử dụng onBackPressed() nếu anh ta muốn nhắm mục tiêu API 5+. Chỉ cần không gọi 'super.onBackPressed()' trừ khi bạn hoàn toàn chắc chắn muốn thoát. – DeeV

0

Tôi nghĩ cách tiếp cận tốt hơn là ủy quyền xử lý khóa lưng cho các đoạn tương ứng. Tôi đã sử dụng một CustomFragment mà hỗ trợ một phương pháp để xử lý các phím trở lại. Tất cả các mảnh vỡ sẽ được mở rộng từ CustomFragment này.

public abstract class BackKeyHandlingFragment extends Fragment { 
    public abstract boolean handleBackKey(); 
} 

Hoạt động có thể ủy quyền xử lý khóa cho đoạn hiện tại. Các mảnh có thể thực hiện các hành động bắt buộc trong việc triển khai thực hiện phương thức handleBackKey tương ứng của chúng. Phương thức này có thể trả về true để yêu cầu hoạt động không xử lý khóa quay lại. Để tiếp tục với hành động chính quay lại mặc định ở cấp Hoạt động, phương thức có thể trả về false.

public void onBackPressed() { 
    BackKeyHandlingFragment fragment = (BackKeyHandlingFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem()); 
    // Fragment should return boolean according to app requirements after processing back key 
    if (!fragment.handleBackKey()) { 
     super.onBackPressed(); 
    } 
} 
1

Trên trang Android Documents

https://developer.android.com/training/animation/screen-slide.html#viewpager

Tôi tìm thấy một ví dụ về xử lý ViewPager trượt và có một phương pháp

@Override 
public void onBackPressed() { 
    if (mPager.getCurrentItem() == 0) { 
    super.onBackPressed(); 
    } 
    else { 
    mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    } 
} 

này chọn trang trước hoặc ra khỏi các hoạt động tích cực .

Các vấn đề liên quan