¿Cómo implementar onBackPressed () y intents en fragmento?

Sé que onBackPressed () es un método en actividad, pero quiero utilizar la funcionalidad en fragmentos, de modo que cuando se presione el botón Atrás, se redirija a otra actividad a través de Intent. Hay alguna solución para esto ?

public class News_Events_fragment extends Fragment { ProgressDialog pd; ListView lv1; SharedPreferences sharedPreferences = null; int NotiCount; TextView txt_title, txt_msg, textView; Context context; Intent intent ; ArrayList CurrentOfficersPastList; NewsActivityAdapter pastAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = (Context) getActivity(); View rootView = inflater.inflate(R.layout.activity_news, container, false); new AsyncTask<Void, Void, ArrayList>() { protected void onPreExecute() { pd = new ProgressDialog(getActivity()); pd.setCancelable(true); pd.setTitle("UPOA"); pd.setMessage("Please wait,loading the data..."); pd.show(); } @Override protected ArrayList doInBackground( Void... params) { System.out.println("In Background"); CurrentOfficersPastList = new ArrayList(); // display view for selected nav drawer item ParseQuery query = ParseQuery.getQuery("message"); query.whereEqualTo("featured_status", true); // query.whereEqualTo("push_status", true); query.orderByDescending("updatedAt"); query.selectKeys(Arrays.asList("title")); query.selectKeys(Arrays.asList("message")); try { query.setCachePolicy(ParseQuery.CachePolicy.NETWORK_ELSE_CACHE); List results = query.find(); for (int i = 0; i < results.size(); i++) { ParseObject object = results.get(i); CurrentOfficersPastList.add(new SliderMsgTitleModel( object.getString("title"), object .getString("message"))); System.out.println("title is==" + object.getString("title") + "&& message is" + object.getString("message") + "size is" + CurrentOfficersPastList.size()); } } catch (Exception e) { e.getMessage(); } pd.dismiss(); return CurrentOfficersPastList; } @SuppressWarnings("unchecked") @Override protected void onPostExecute(ArrayList value) { pd.dismiss(); /*Intent ent = new Intent(getActivity(), NewsActivity.class); ent.putExtra("NEWSLIST", (ArrayList) value); startActivity(ent); System.out.println("Value is" + value.size());*/ CurrentOfficersPastList = new ArrayList(); CurrentOfficersPastList = value; lv1 = (ListView) getActivity().findViewById(R.id.list_title); pastAdapter = new NewsActivityAdapter(getActivity(), R.layout.activity_news_txt, CurrentOfficersPastList); lv1.setAdapter(pastAdapter); } }.execute(); return rootView; } public void onBackPressed() { // TODO Auto-generated method stub //super.onBackPressed(); //Toast.makeText(getApplicationContext(), "click",2000).show(); String cameback="CameBack"; intent = new Intent(getActivity(),HomeActivity.class); intent.putExtra("Comingback", cameback); startActivity(intent); } } 

Anular onKeyDown en lugar de onBackPressed. No necesariamente . Pero esto funciona para mí

 public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: String cameback="CameBack"; intent = new Intent(getActivity(),HomeActivity.class); intent.putExtra("Comingback", cameback); startActivity(intent); return true } return false; } 

Puedes interactuar con el fragmento usando una interfaz de callback. En su actividad agregue lo siguiente:

 public class MyActivity extends Activity { protected OnBackPressedListener onBackPressedListener; public interface OnBackPressedListener { void doBack(); } public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { this.onBackPressedListener = onBackPressedListener; } @Override public void onBackPressed() { if (onBackPressedListener != null) onBackPressedListener.doBack(); else super.onBackPressed(); } @Override protected void onDestroy() { onBackPressedListener = null; super.onDestroy(); } } 

En tu fragmento agrega lo siguiente:

 public class MyFragment extends Fragment implements MyActivity.OnBackPressedListener { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((MyActivity) getActivity()).setOnBackPressedListener(this); } @Override public void doBack() { //BackPressed in activity will call this; } } 

Sí hay. Deberías implementar esto.

 @Override public void onBackPressed() { if (fragment != null) //user defined onBackPressed method. Not of Fragment. fragment.onBackPressed(); } else { //this will pass BackPress event to activity. If not called, it will //prevent activity to get BackPress event. super.onBackPressed(); } } 

Explicación

  1. Verifica si tu fragmento está inicializado o no. Si es así, pase el evento de retroceso a su fragmento.
  2. Si la condición anterior no se aprueba, simplemente pase de nuevo a su actividad para que la maneje.

Nota

Aquí la condición puede ser cualquier cosa. Solo tomo la inicialización de fragment como un ejemplo. Puede ser que no te puedan ayudar. Necesita definir su propia condición para pasarla a fragmento.

Editar

Creé una aplicación de muestra en GitHub para implementar Back Stack de fragmento.

Descargue la aplicación Fragment Back Stack .

Puede implementar onKeyListener para su fragmento y llamar a la siguiente actividad dentro de eso. Nunca he intentado esto. Pero espero que pueda ayudar

Por ejemplo

 fragmentObject.getView().setOnKeyListener( new OnKeyListener() { @Override public boolean onKey( View v, int keyCode, KeyEvent event ) { if( keyCode == KeyEvent.KEYCODE_BACK ) { //your code here } return false; } } ); 

Debes anular el método de prueba de Fallido en fragmento.