2017-07-07 11 views
0

私のフラグメントでonBackPressed()を使用しようとしているため、ユーザーは自分のアプリでナビゲートした断片の山でロールバックすることができます。onBackPressed()and Fragments

問題は、以下のメソッドを私のFragmentに追加すると、エラー:Method does not override method from its superclassが返されます。

@Override 
public void onBackPressed() { 

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

} 

あなたはその理由をご存知でしょうか?

ありがとうございます!ここで

は全体の断片行く:onBackPressed

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の目的はまさにこの1つです。あなたが何かを上書きしていると思っていることを知らせていますが、実際にはあなたはそうではありません。

サイドノートには、あなたが戻るボタンを押した場合、バックスタックに断片があると、自動的にポップされます。あなたが望むものを達成するために、この

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

使用方法を()と(popBackStackを呼び出す)私はmissunderstood場合は、私が行方不明です場合は、あなたのActivityクラスではなく、フラグメント

+0

このコードの記述は必要ありません。 Androidはすでにあなたのためにこれを行います。 –

0

ですみません何か、onBackPressed()は、スーパークラス(あなたのケースではフラグメントクラス)のメソッドではないため、エラーが発生します

1

を試してみてください、あなたはそのように関連付けられているActivityonBackPressed()をオーバーライドする必要があります。

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

は、この情報がお役に立てば幸いです。 私の英語を残念に思っています。

関連する問題