Le démarrage de l'activité à partir d'un fragment
J'ai 2 fragments sur les deux fragments d'un bouton. Lorsque j'appuie sur le bouton, je voudrais commencer une nouvelle Activité. Mais je ne peux pas le faire fonctionner.
L'erreur que je reçois: ERREUR ici: incompatibilité de Type: impossible de convertir de mFragmentFavorite de Fragment
Ce que je fais mal?
MyFragmentPagerAdapter
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
final int PAGE_COUNT = 3;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
switch(arg0){
case 0:
return new FavoriteActivity();
//ERROR: Type mismatch: cannot convert from FavoriteActivity to Fragment
case 1:
return new SettingsActivity();
default:
return null;
}
}
/** Returns the number of pages */
@Override
public int getCount() {
return PAGE_COUNT;
}
}
FavoriteActivity
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class FavoriteActivity extends Activity{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main_favorite, container, false);
OnClickListener listnr=new OnClickListener() {
@Override
public void onClick(View v) {
Intent i= new Intent("aFavorite");
startActivity(i);
}
};
Button btn =(Button) v.findViewById(R.id.mainFavorite);
btn.setOnClickListener(listnr);
return v;
}
}
Si FavoriteActivity s'étend fragments, l'erreur a disparu, mais ensuite j'ai une erreur à findViewById(R.id.mainFavorite);
et l'erreur est
La méthode findViewById(int) n'est pas défini pour le type
FavoriteActivity
EDIT:
Lorsque j'appuie sur le bouton dans le fragment au début de l'activité, puis l'application se bloque
c'est mon logcat
03-18 16:01:23.985: E/AndroidRuntime(1985): FATAL EXCEPTION: main
03-18 16:01:23.985: E/AndroidRuntime(1985): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=FavoriteActivityList }
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1569)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1420)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.app.Activity.startActivityForResult(Activity.java:3446)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.app.Activity.startActivityForResult(Activity.java:3407)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:826)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.support.v4.app.Fragment.startActivity(Fragment.java:838)
03-18 16:01:23.985: E/AndroidRuntime(1985): at com.example.spui.FavoriteActivity$1.onClick(FavoriteActivity.java:24)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.view.View.performClick(View.java:4211)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.view.View$PerformClick.run(View.java:17267)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.os.Handler.handleCallback(Handler.java:615)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.os.Handler.dispatchMessage(Handler.java:92)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.os.Looper.loop(Looper.java:137)
03-18 16:01:23.985: E/AndroidRuntime(1985): at android.app.ActivityThread.main(ActivityThread.java:4898)
03-18 16:01:23.985: E/AndroidRuntime(1985): at java.lang.reflect.Method.invokeNative(Native Method)
03-18 16:01:23.985: E/AndroidRuntime(1985): at java.lang.reflect.Method.invoke(Method.java:511)
03-18 16:01:23.985: E/AndroidRuntime(1985): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
03-18 16:01:23.985: E/AndroidRuntime(1985): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
03-18 16:01:23.985: E/AndroidRuntime(1985): at dalvik.system.NativeStart.main(Native Method)
- Peut-être vous ne devriez pas prolonger FragmentActivity mais plutôt Fragment?
- Eh bien, pour que vous n'utilisez pas
Fragments
. Au moins pas dans le code que vous avez posté.
Vous devez vous connecter pour publier un commentaire.
mFragmentFavorite
dans votre code est unFragmentActivity
qui n'est pas la même chose qu'unFragment
. C'est pourquoi vous obtenez l'incompatibilité de type. Aussi, vous ne devriez jamais appelnew
sur unActivity
comme ce n'est pas la bonne façon de démarrer une.Si vous souhaitez démarrer une nouvelle instance de
mFragmentFavorite
, vous pouvez le faire via uneIntent
.À partir d'un
Fragment
:À partir d'un
Activity
Si vous voulez commencer à
aFavorite
au lieu demFragmentFavorite
alors vous avez seulement besoin de changer leurs noms dans le crééIntent
.Aussi, je recommande de changer les noms de classe pour être plus précis. L'appel de quelque chose
mFragmentFavorite
est abusive en ce qu'elle n'est pas uneFragment
à tous. Aussi, les déclarations de classe en Java généralement commencer par une lettre majuscule. Vous feriez bien de le nom de votre classe, quelque chose commeFavoriteActivity
pour être plus précis et de respecter les conventions de la langue. Vous aurez aussi besoin de renommer le fichier FavoriteActivity.java si vous choisissez de le faire depuis Java exige de la classe le nom correspond au nom de fichier.Mise à JOUR
Aussi, on dirait que vous en fait destiné à
mFragmentFavorite
être unFragment
au lieu d'unFragmentActivity
en fonction de votre utilisation deonCreateView
. Si vous voulezmFragmentFavorite
être unFragment
puis modifiez la ligne de code suivante:Faire cela au lieu de lire:
Fragment
ou unActivity
. Si vous utilisez le code à l'intérieur de l'une de ces classes, alors vous pouvez simplement remplacermContextReference
soit avecgetActivity()
pourFragment
outhis
pourActivity
sur la première ligne etthis
pour la deuxième ligne. Je vais mettre à jour la réponse à être plus clair.Fragment
puis changerfindViewById
àv.findViewById
. Il n'y a pas defindViewById
fonction dansFragment
de sorte que vous devez appelergetView
d'abord, puis appelfindViewById
sur que. Dans votre cas, vous avez déjà votre point de vue dansonCreateView
et que serait votre variablev
.Activity
est enregistré dans votre manifeste. Si votre question initiale a été posée ici, alors je vous suggère de marquer une réponse comme acceptée en cliquant sur la case à cocher sous la vote de flèches et de poser une nouvelle question en décrivant l'erreur/crash que vous obtenez une copie de la trace de la pile. Voici un bon endroit pour commencer avec votre crash si: stackoverflow.com/questions/4481903/...finish();
à la fin, ou vous n'avez pas?finish()
est entièrement en cas d'utilisation de base. Si vous essayez de démarrer une nouvelle activité lors de la fermeture de l'actuel, alors oui. Cependant, qui rompt la pile de navigation en fonction de ce que vous obtenez avec les activités de sorte que vous avez à faire assurez-vous que vous voulez vraiment le faire au lieu de peut-être trouver un meilleur modèle de navigation. Maintenant, si vous faites allusion à la fermeture de la nouvelle activité après avoir été démarré, vous pouvez le faire dans le code avec lesfinish()
méthode ou l'utilisateur peut utiliser la touche retour pour fermer la nouvelle a commencé l'activité.Vous devez utiliser
getActivity()
à lancer des activités à partir de fragmentsAussi, vous devez être appellation des classes avec des bouchons:
MFragmentActivity
au lieu demFragmentActivity
.Je utiliser dans mon fragment.
Si vous utilisez getActivity() alors vous devez vous assurer que la vocation de l'activité est ajouté déjà. Si l'activité n'a pas été ajouté dans de tels cas, de sorte que vous pouvez obtenir null lorsque vous appelez getActivity()
dans de tels cas getContext() est sûr
puis le code de démarrage de l'activité sera légèrement modifié comme,
D'activités, de Services et d'Applications s'étend ContextWrapper classe de sorte que vous pouvez utiliser ce ou getContext() ou getcontexteapplication() à la place du premier argument.
Vous pouvez avoir à remplacer getActivity() avec MainActivity.pour ceux qui ont des problèmes avec cela.
Démarrer une nouvelle Activité à Partir d'un Fragment:
Démarrer une nouvelle Activité à Partir d'une Activité:
avec Kotlin j'exécute ce code:
requireContext().startActivity<YourTargetActivity>()