2013-08-12 74 views
21

Tôi đang làm việc trên một dự án và tôi cần có khả năng sử dụng nút quay lại trong từng đoạn để điều hướng giữa các đoạn trước đó, tôi có phương pháp được viết để làm như vậy bằng cách sử dụng mũi tên quay lại trong thanh tác vụ, tuy nhiên, tôi muốn có thể sử dụng chức năng tương tự trên nút quay lại được nhấn. Tôi không muốn sử dụng ngăn xếp lại. Có cách nào để làm việc này không?Sử dụng onBackPressed() trong Android Fragments

EDIT

Thay vì sử dụng ngăn xếp trở lại tôi muốn để có thể gọi trở lại phương pháp trước đây khi người dùng nhấp vào nút quay lại. Tôi cần phải sử dụng phương pháp gobackpressed trong các mảnh vỡ. Điều này có thể không? Tôi hy vọng điều này rõ ràng và súc tích. Xin lỗi vì bất kỳ sự nhầm lẫn nào gây ra ở trên.

Trở lại trang trước

public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){ 

    FragmentManager fm = getSupportFragmentManager(); 

    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out); 

    ft.show(preFragment); 

    //**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK** 

    ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag)); 
    ft.addToBackStack(null); 
    ft.commit(); 

    Misc.currentContentFragmentTag = preFragmentTag; 

    createBar(preFragment); 
} 

Go Forward

public void gotoNextFragment(String nextTag, Fragment nextFragment){ 

    FragmentManager fm = getSupportFragmentManager(); 

    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out); 

    boolean newlyCreated = false; 
    if(nextFragment == null){ 
     nextFragment = Fragment.instantiate(this, nextTag); 
     newlyCreated = true; 
    } 

    //hide current fragment 
    ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag)); 

    if(newlyCreated){ 
     ft.add(R.id.content_frame, nextFragment, nextTag); 
    } 
    else{ 
     ft.show(nextFragment); 
    } 

    ft.addToBackStack(null); 
    ft.commit(); 
    Misc.currentContentFragmentTag = nextTag; 

    createBar(nextFragment); 
} 

Đây là những cách để điều hướng qua lại, và tôi muốn để có thể thực hiện quay trở lại phương pháp trên onBackPressed(). Điều này có nghĩa không?

+0

vấn đề tương tự giải quyết [ở đây] (https: // stackoverflow.com/a/46425415/6831069)> Thưởng thức –

Trả lời

19

Tại sao bạn không muốn sử dụng ngăn xếp lại? Nếu có vấn đề hoặc nhầm lẫn tiềm ẩn, có thể chúng tôi có thể xóa nó cho bạn.

Nếu bạn muốn tuân theo yêu cầu của mình, chỉ cần ghi đè phương thức onBackPressed() của Activity và gọi bất kỳ phương thức nào bạn đang gọi khi mũi tên quay lại trong ActionBar của bạn được nhấp.

EDIT: Làm thế nào để giải quyết "màn hình đen" mảnh trở lại ngăn xếp vấn đề:

Bạn có thể khắc phục vấn đề đó bằng cách thêm một người biết lắng nghe backstack cho người quản lý mảnh. Đó là người biết lắng nghe kiểm tra nếu các mảnh lại ngăn xếp rỗng và kết thúc các Hoạt động cho phù hợp:

Bạn có thể thiết lập rằng người nghe trong phương pháp onCreate Hoạt động của bạn:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FragmentManager fm = getFragmentManager(); 
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if(getFragmentManager().getBackStackEntryCount() == 0) finish(); 
     } 
    }); 
} 
+0

cảm ơn vì câu trả lời, lý do tôi đang cố gắng tránh ngăn xếp ngược lại là khi tôi thêm vào ngăn xếp lại và xóa fr agment, khi tôi bấm vào nút để mở mảnh đó một lần nữa tôi đã nhận được một màn hình màu đen, tôi nên làm một số loại thu hồi trong trường hợp đó? Tôi mới làm quen với các mảnh vỡ và tôi đang cố gắng tiếp nhận mã viết trước đó. –

+0

@ DJ-DOO Tôi đã nghĩ như vậy, rằng đây là vấn đề. Khi tôi bắt đầu với các mảnh tôi chạy vào cùng một vấn đề chính xác. Tuy nhiên, có một giải pháp cho vấn đề đó. Hãy để tôi đào một số mã và cập nhật câu trả lời của tôi ... – tiguchi

+0

tuyệt vời .. Tôi đang bị kẹt vào lúc này và không chắc chắn phải làm gì tiếp theo –

3

Trong đoạn mà bạn muốn để xử lý nút quay lại của bạn bạn nên đính kèm công cụ để xem bạn trong oncreateview

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.second_fragment, container, false); 
    v.setOnKeyListener(pressed); 
    return v; 
} 



@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
    // TODO Auto-generated method stub 
    if(keyCode == KeyEvent.KEYCODE_BACK){ 
      // back to previous fragment by tag 
      myfragmentclass fragment = (myfragmentclass) getActivity().getSupportFragmentManager().findFragmentByTag(TAG); 
      if(fragment != null){ 
       (getActivity().getSupportFragmentManager().beginTransaction()).replace(R.id.cf_g1_mainframe_fm, fragment).commit(); 
      } 
      return true; 
     } 
     return false; 
    } 
}; 
+5

bạn đã xác định biến 'đã ép' ở đâu? – Daryn

+1

Bạn có thể xác định 'ép' như thế này: OnKeyListener ép = new OnKeyListener() { \t \t \t \t @ Override \t \t public boolean onKey (Xem v, int keyCode, KeyEvent sự kiện) { \t \t if (keyCode == KeyEvent.KEYCODE_BACK) { \t \t trả về true; \t} \t trả về false; \t \t} \t}; – icastell

+2

@ user2886881 Ghi đè 'onKey()' trong một đoạn? Tôi không nghĩ vậy. –

2

bạn có thể thử ghi đè onCreateAnimation, tham số và bắt enter==false. Điều này sẽ kích hoạt trước mỗi lần nhấn lại.

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {    
     if(!enter){ 
      //leaving fragment 
      Log.d(TAG,"leaving fragment"); 
     } 
     return super.onCreateAnimation(transit, enter, nextAnim); 
    } 
+0

Giải pháp này thực sự hoạt động tốt nhưng tôi đang nghĩ, là hack hay giải pháp này để xử lý trên backpressed – androidXP

-6

Sử dụng này:

@Override 
public void onBackPressed() { 
    int fragments = getFragmentManager().getBackStackEntryCount(); 
    if (fragments == 1) { 
     finish(); 
    } 
    super.onBackPressed(); 
} 
29

tôi không tìm thấy bất kỳ câu trả lời tốt về vấn đề này, vì vậy đây là giải pháp của tôi.

Nếu bạn muốn quay lạiBấm vào từng đoạn, hãy làm như sau.

tạo giao diện OnBackPressedListener

public interface OnBackPressedListener { 
    void onBackPressed(); 
} 

Đó từng mảnh mà muốn được thông báo về backPressthực hiện giao diện này.

Trong hoạt động phụ huynh, bạn có thể ghi đè lên onBackPressed()

@Override 
public void onBackPressed() { 
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
    if (fragmentList != null) { 
     //TODO: Perform your logic to pass back press here 
     for(Fragment fragment : fragmentList){ 
      if(fragment instanceof OnBackPressedListener){ 
       ((OnBackPressedListener)fragment).onBackPressed(); 
      } 
     } 
    } 
} 
+1

Cảm ơn bạn thân !!! làm việc như một sự quyến rũ! ~ –

+1

Các giải pháp khác cũng hoạt động, nhưng đối với tôi, điều này có vẻ tốt hơn. :) –

+0

Điều gì sẽ xảy ra nếu mảnh của tôi có một số đoạn con mà tôi cũng muốn xử lý OnBackPressed? – Micer

2

Đối với một Fragment bạn chỉ có thể thêm

getActivity().onBackPressed(); 

mã của bạn

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