1

Я хочу реализовать пользовательские методы onBackPressed для всех моих фрагментов, которые включены в мою основную деятельность. Но я не получаю крючок при нажатии на мое устройство. Я попытался реализовать несколько материалов, доступных в SOF, но никто из них не работает должным образом. Пожалуйста, помогите!Как реализовать onBackPressed для Android Fragment?

Я попробовал это в onCreateView:

rootView.setFocusableInTouchMode(true); 
rootView.requestFocus(); 
rootView.setOnKeyListener(new OnKeyListener() 
{ 
@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) 
{ 
    if(keyCode == KeyEvent.KEYCODE_BACK) 
    { 
     return true; 
    } 
    return false; 
} 
}); 
+0

пожалуйста, посмотрите на эту ссылку http://stackoverflow.com/questions/7992216/android-fragment-handle-back-button-press –

+0

Благодаря @Rajsundar. Но это решение не работает для следующего случая: A-B B-C Теперь onBack фрагмента B не вызывается. – pagalpanda

+0

можете ли вы отправить свой код. –

ответ

0

Та же проблема здесь. Я решаю это, устанавливая заголовок actionbar для фрагмента, а затем проверяем onBackPressed, какой фрагмент в настоящее время видим, проверяя заголовок ActionBar. Это не правильное решение, но оно отлично работает для меня. если у вас есть вопросы, скажите мне. Надеюсь, это сработает для вас. Thanx

+0

Этот способ настолько прост, что вам просто нужно дать правильный заголовок конкретному фрагменту, и он работает. если вам нужен код, скажите мне –

+0

Спасибо Akhil. Это будет работать. Но некоторые из моих фрагментов имеют один и тот же заголовок ActionBar, и на основе нескольких условий мне нужно установить строку заголовка фрагмента, к которому я буду перемещаться, при нажатии на нее. – pagalpanda

+0

Вы должны установить уникальное название для фрагмента, тогда оно работает. Пожалуйста, дайте репутацию и отметьте как правильный ответ, пожалуйста. Так что другой человек использует его –

1
public interface OnBackPressedListener { 
    boolean onBackPressed(); 
} 

public interface OnBackPressedNotifier { 
    void registerOnBackPressedListener(OnBackPressedListener listener); 
    void unregisterOnBackPressedListener(OnBackPressedListener listener); 
} 




public class SampleActivity extends Activity implements OnBackPressedNotifier { 

    List<OnBackPressedListener> onBackPressedListeners = new ArrayList<>(); 

    @Override 
    public void registerOnBackPressedListener(OnBackPressedListener listener) { 
    if (!onBackPressedListeners.contains(listener)) 
     onBackPressedListeners.add(listener); 
    } 

    @Override 
    public void unregisterOnBackPressedListener(OnBackPressedListener listener) { 
    if(onBackPressedListeners.contains(listener)) 
     onBackPressedListeners.remove(listener); 
    } 

    @Override 
    protected void onDestroy() { 
    onBackPressedListeners.clear(); 
    super.onDestroy(); 
    } 

    private boolean notifyOnBackPressed(){ 
     boolean handledByFragment = false; 
     for (OnBackPressedListener listener : onBackPressedListeners){ 
      handledByFragment = listener.onBackPressed(); 
      if (handledByFragment) 
       break; 
     } 
     return handledByFragment; 
    } 

    @Override 
    public void onBackPressed() { 
     if (!notifyOnBackPressed()) 
      super.onBackPressed(); 
    } 

}

public class SampleFragment extends android.support.v4.app.Fragment implements OnBackPressedListener { 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    ((OnBackPressedNotifier)getActivity()).registerOnBackPressedListener(this); 
} 

@Override 
public void onDetach() { 
    ((OnBackPressedNotifier)getActivity()).unregisterOnBackPressedListener(this); 
    super.onDetach(); 
} 

@Override 
public boolean onBackPressed() { 
    // Handle onBackPressed 
    return false; 
} 
+0

Это не работает, если У меня есть фрагменты, добавленные (не заменяемые). – pagalpanda

+0

, чтобы вы отображали и скрывали фрагменты? – aschattney

2

Использование ниже кода, надеюсь, этот код поможет вам.

rootView.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 


      if (keyCode == KeyEvent.KEYCODE_BACK) { 


       backFlag = backFlag++; 

       if (backFlag == 2) { 
        getActivity().finish(); 
       } 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       backFlag = 0; 

       return true; 
      } 
      return false; 
     } 
    }); 
Смежные вопросы