2017-07-07 8 views
0

Ich versuche, onBackPressed() in meinem Fragment zu verwenden, damit ich dem Benutzer erlauben kann, in einem Stapel von Fragmenten, die er in meiner App navigierte, zurück zu rollen.onBackPressed() und Fragmente

Das Problem ist, dass, wenn ich die Methode unten zu meinem Fragment hinzufügen, gibt es mir den Fehler: Method does not override method from its superclass.

@Override 
public void onBackPressed() { 

    android.support.v4.app.FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.popBackStack(); 

} 

Würdest du wissen warum?

Danke!

geht hier das gesamte Fragment:

package it.bitrack.fabio.bitrack; 

import android.content.Context; 
import android.net.Uri; 
import android.os.Bundle; 
//import android.app.Fragment; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 
import android.widget.ArrayAdapter; 

import java.util.ArrayList; 
import java.util.Arrays; 
import android.view.KeyEvent; 


/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* {@link AssetMngtView.OnFragmentInteractionListener} interface 
* to handle interaction events. 
* Use the {@link AssetMngtView#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class AssetMngtView extends Fragment { 
    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    View view; 

    ListView assetMngtListView; 
    ArrayAdapter<String> listAdapter; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 

    private OnFragmentInteractionListener mListener; 

    public AssetMngtView() { 
     // Required empty public constructor 
    } 

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment AssetMngtView. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static AssetMngtView newInstance(String param1, String param2) { 
     AssetMngtView fragment = new AssetMngtView(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onBackPressed() { 

     android.support.v4.app.FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.popBackStack(); 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     view = inflater.inflate(R.layout.fragment_asset_mngt_view, container, false); 

     assetMngtListView = (ListView) view.findViewById(R.id.assetMngtListView); 
     setListView(); 


     return view; 
    } 

    public void setListView() { 

     String[] options = new String[]{"Bind tag & thing", "Create new thing", "Edit existent thing", "Maintain existent thing", "View things notifications"}; 

     ArrayList<String> optionsList = new ArrayList<String>(); 
     optionsList.addAll(Arrays.asList(options)); 

     listAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, optionsList); 

     assetMngtListView.setAdapter(listAdapter); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    /** 
    * This interface must be implemented by activities that contain this 
    * fragment to allow an interaction in this fragment to be communicated 
    * to the activity and potentially other fragments contained in that 
    * activity. 
    * <p> 
    * See the Android Training lesson <a href= 
    * "http://developer.android.com/training/basics/fragments/communicating.html" 
    * >Communicating with Other Fragments</a> for more information. 
    */ 
    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteraction(Uri uri); 
    } 
} 
+0

Bitte geben Sie ein [mcve]. Welche Klasse enthält insbesondere die Methode, die Sie überschreiben? Wie erstellen und zeigen Sie Ihre Fragmente? –

+1

Beachten Sie, dass durch Drücken der Zurück-Taste der hintere Stapel automatisch geöffnet wird. Es gibt keinen Grund, onBackPressed() zu überschreiben, um dies selbst zu tun. –

+0

Diese Methode sollte eine native Android-Methode sein, die die Zurück-Schaltfläche behandelt, die in jedem Android-Telefon verfügbar ist. Mein Code ist in meiner Frage vollständig verfügbar. –

Antwort

2

das Problem ist, dass Fragment nicht public void onBackPressed() Methode hat.

Sie erhalten den Fehler, weil Ihre Methode mit @Override annotiert ist, aber es tatsächlich keine Methode in der Oberklasse überschreibt. der Zweck von @Override ist genau dies, damit Sie wissen, dass Sie denken, dass Sie etwas außer Kraft setzen, aber eigentlich sind Sie nicht

auf einer Randnotiz, was Sie versuchen zu tun ist unnötig. Wenn du den Zurück-Knopf drückst und du Fragmente im Backstack hast, werden sie automatisch gepoppt. versuchen, diese

public class FragmentsActivity extends AppCompatActivity { 

    public static class FragmentA extends Fragment { 
     @Nullable 
     @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
      View view = new TextView(getActivity()); 
      view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
      view.setBackgroundColor(0xffff0000);  
      return view; 
     } 
    } 

    public static class FragmentB extends Fragment { 
     @Nullable 
     @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
      View view = new TextView(getActivity()); 
      view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
      view.setBackgroundColor(0xff00ff00);  
      return view; 
     } 
    } 

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

     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction() 
       .add(R.id.fragment_container, new FragmentA(), FragmentA.class.getSimpleName()) 
       .commit(); 

     // notice addToBackStack here 
     fm.beginTransaction() 
       .add(R.id.fragment_container, new FragmentB(), FragmentB.class.getSimpleName()) 
       .addToBackStack(FragmentB.class.getSimpleName()) 
       .commit(); 
    } 
} 
0

Verwenden Sie die Methode onBackPressed() und popBackStack() in Ihrer Aktivitätsklasse nennen, nicht in Fragment

+0

Das Schreiben dieses Codes ist nicht notwendig. Android macht das schon für dich. –

0

Es tut mir leid, wenn ich missunderstood oder wenn ich vermisst etwas, aber Sie erhalten den Fehler, weil OnBackPressed() ist keine Methode der Super-Klasse (Fragment-Klasse in Ihrem Fall)

1

Um das zu erreichen, was Sie wollen, sollten Sie die onBackPressed() der Activity wie das im Zusammenhang außer Kraft setzen:

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 1) { 
     getSupportFragmentManager().popBackStack(); 
    } else { 
     finish(); 
    } 
} 

Hoffnung, das hilft. Entschuldigung für mein Englisch.