2017-07-07 70 views
0

我想在我的片段中使用onBackPressed(),以便我可以允許用戶回滾他在我的應用程序中導航的一堆碎片。onBackPressed()和片段

問題是,當我將下面的方法添加到我的片段時,它給了我錯誤:Method does not override method from its superclass

@Override 
public void onBackPressed() { 

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

} 

你知道爲什麼嗎?

謝謝!

這裏去整個片段:

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

請提供[mcve]。特別是,什麼類包含你重寫的方法?另外,你如何創建和展示你的片段? –

+1

請注意,按下後退按鈕會自動彈出後退堆棧。沒有理由重寫'onBackPressed()'來自己做這件事。 –

+0

此方法應該是一種原生Android方法,可處理任何Android手機中的後退按鈕。我的代碼在我的問題中完全可用。 –

回答

2

問題是Fragment沒有public void onBackPressed()方法。

由於您的方法使用@Override進行了註釋,但您實際上並未覆蓋超類中的任何方法,所以您會收到錯誤消息。 @Override的目的就是這一個,讓你知道你認爲自己壓倒一切,但實際上,你不是沒有必要做的,你不是不需要。如果按下後退按鈕,並且在後退堆疊中有碎片,則會自動彈出。試試這個

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

使用方法onBackPressed(),並在你的Activity類調用popBackStack(),而不是在片段

+0

寫這段代碼是沒有必要的。 Android已經爲你做了這個。 –

0

我很抱歉,如果我missunderstood或者如果我失蹤東西,但你得到的錯誤,因爲onBackPressed()不是超級類的方法(你的情況下的片段類)

1

達到你想要什麼,你應該重寫這樣的相關的ActivityonBackPressed()

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

希望這有助於。 對不起,我的英語。