Android Studio se “Doit mettre en œuvre OnFragmentInteractionListener”
Je suis un lancer qui "Doit mettre en œuvre OnFragmentInteractionListener, et j'ai déjà l'avoir...
J'ai regardé à chaque question posée ici, et personne ne m'a aidé.
Quelqu'un pourrait-il m'aider?
ERREUR:
FATAL EXCEPTION: main
Process: com.example.android.navigationdrawer, PID: 5916
java.lang.RuntimeException: com.example.android.navigationdrawer.MainActivity@3aefae64 must implement OnFragmentInteractionListener
at com.example.android.navigationdrawer.FragmentCamera.onAttach(FragmentCamera.java:83)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1019)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5930)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
MAINACTIVITY (jusqu'à la OnFragmentInteractionListener)
package com.example.android.navigationdrawer;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, FragmentCamera.OnFragmentInteractionListener {
MAINACTIVITY (FragmentCamera @Override)
@Override
public void onFragmentInteraction(Uri uri) {
}
MAINACTIVITY (ONCREATE)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
MAINACTIVITY (FRAGMENT DE TRANSACTION)
boolean FragmentTransaction = false;
Fragment fragment = null;
//Camera
if (id == R.id.nav_camera) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(intent);
ImageView mImageView = (ImageView) findViewById(R.id.Galley1);
//Galley
} else if (id == R.id.nav_gallery) {
fragment = new FragmentCamera();
FragmentTransaction = true;
}
...
if(FragmentTransaction) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.drawer_layout, fragment)
.commit();
item.setChecked(true);
getSupportActionBar().setTitle(item.getTitle());
}
FRAGMENTCAMERA
package com.example.android.navigationdrawer;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link FragmentCamera.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link FragmentCamera#newInstance} factory method to
* create an instance of this fragment.
*/
public class FragmentCamera 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";
//TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public FragmentCamera() {
//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 FragmentCamera.
*/
//TODO: Rename and change types and number of parameters
public static FragmentCamera newInstance(String param1, String param2) {
FragmentCamera fragment = new FragmentCamera();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@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
return inflater.inflate(R.layout.fragment_camera, container, false);
}
//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);
}
}
Si vous avez besoin d'un peu plus de code, commentaire et je vais l'ajouter!
- avez-vous déclarer le fragment dans votre Activité de mise en page, avec la balise <fragment ?
- Dois-je faire si je veux qu'il apparaît lorsque l'on clique sur un bouton? @Blackbelt
- Je n'ai pas déclaré. Maintenant, puis-je vous demander? Merci. Dois-je faire si je veux qu'il apparaît lorsque l'on clique sur un bouton? @Blackbelt
- non, vous n'en avez pas besoin. Avez-vous des plus d'un
OnFragmentInteractionListener
? Post de votre Activité onCreate - Je n'ai que celui-ci, pour le moment. Je vais ajouter un peu plus. Comment pourrais-je résoudre l'erreur? @Blackbelt
- J'ai édité et publié OnCreate
- où est le Fragment de la transaction ?
- Re édité et ajouté @BlackBelt
- Pourquoi avez-vous une méthode newInstance lorsque vous êtes en utilisant le constructeur par défaut?
- Il a été pré déclaré par Android Studio @jobbert
- Je vais venir avec une nouvelle réponse à essayer de reproduire le bug de la première
- puisqu'il est entièrement code du modèle, vous pouvez télécharger sur github? Je ne peux pas obtenir le blocage de ce code.
- J'ai roulé MainActivity et FragmentCamera à github: github.com/adriailla/Navigation-Drawer.git @jobbert
- Recherche pour
OnFragmentInteractionListener
dans votre Fragment de classes et de voir si ça déclenche une exception
Vous devez vous connecter pour publier un commentaire.
Supprimer
onAttach
méthode de votre Fragment, alors il va bien.Simplement supprimer cette ligne:
Il n'y a aucun besoin de retirer l'ensemble de la méthode.
Ici, c'est pourquoi les solutions ci-dessus éliminer l'erreur. Le si l'instruction à l'intérieur de le remplacé onAttach méthode de FragmentCamera.java est de vérifier si le fragment parent de l'activité met en œuvre la OnFragmentInteractionListener de l'interface, qui est définie à l'intérieur d' FragmentCamera.java. Le correspondant else renvoie une erreur si l'activité parent n'implémente pas l'interface. L'interface est utile mais pas nécessaire.
Par la voie, onAttach est le fragment de la première du cycle de vie de la méthode, et il est "appelé une fois le fragment est associé à son activité". Sa version est obsolète: onAttach(Activité).
Sa nouvelle version est: onAttach(Contexte). Espérons que cela aide quelqu'un.