Tengo 2 fragmentos con en ambos fragmentos un botón. Cuando presiono el botón, me gustaría iniciar una nueva actividad. Pero no puedo hacer que funcione.
El error que recibo: ERROR aquí: no coinciden los tipos: no se puede convertir de mFragmentFavorite a Fragment
¿Qué estoy haciendo 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;
}
}
Actividad favorita
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 extiende fragmentos, el error desaparece, pero luego aparece un error en findViewById(R.id.mainFavorite);y el error es
El método findViewById (int) no está definido para el tipo FavoriteActivity
EDITAR:
Cuando presiono el botón en el fragmento para iniciar la actividad, la aplicación se bloquea, este es mi 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)

Fragments. Al menos no en el código que publicaste.Respuestas:
mFragmentFavoriteen su código es unFragmentActivityque no es lo mismo que unFragment. Es por eso que aparece la falta de coincidencia de tipos. Además, nunca debe recurrirnewa unaActivityya que esa no es la forma correcta de iniciar una.Si desea iniciar una nueva instancia de
mFragmentFavorite, puede hacerlo mediante un archivoIntent.De un
Fragment:Intent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);Desde un
ActivityIntent intent = new Intent(this, mFragmentFavorite.class); startActivity(intent);Si desea comenzar en
aFavoritelugar demFragmentFavorite, solo necesita cambiar sus nombres en el archivo creadoIntent.Además, recomiendo cambiar los nombres de las clases para que sean más precisos. Llamar a algo
mFragmentFavoritees inapropiado en el sentido de que no lo esFragmenten absoluto. Además, las declaraciones de clase en Java suelen comenzar con una letra mayúscula. Haría bien en nombrar su clase de una maneraFavoriteActivitymás precisa y conforme a las convenciones del idioma. También deberá cambiar el nombre del archivo a FavoriteActivity.java si elige hacerlo, ya que Java requiere que los nombres de clase coincidan con el nombre del archivo.ACTUALIZAR
Además, parece que en realidad pretendías
mFragmentFavoriteser un enFragmentlugar de unFragmentActivitysegún tu uso deonCreateView. Si quieresmFragmentFavoriteser unFragment, cambia la siguiente línea de código:public class mFragmentFavorite extends FragmentActivity{Haga que esto en su lugar lea:
public class mFragmentFavorite extends Fragment {fuente
Fragmento unActivity. Si está utilizando el código dentro de una de esas clases, puede reemplazarlomContextReferencecongetActivity()forFragmentothisforActivityen la primera línea ythisen la segunda línea. Actualizaré la respuesta para que sea más clara.FragmentcambiefindViewByIdav.findViewById. No hayfindViewByIdfunción en,Fragmentpor lo que debe llamargetViewprimero y luego llamarfindViewByIda eso. Sin embargo, en su caso, ya tiene su vistaonCreateViewy esa sería su variablev.Deberías usar
getActivity()para lanzar actividades desde fragmentosIntent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);Además, debería nombrar las clases con mayúsculas: en
MFragmentActivitylugar demFragmentActivity.fuente
Si está utilizando getActivity () , debe asegurarse de que la actividad de llamada ya esté agregada . Si no se ha agregado actividad en tal caso, puede obtener un valor nulo cuando llame a getActivity ()
en tales casos, getContext () es seguro
entonces el código para iniciar la actividad cambiará ligeramente como,
Intent intent = new Intent(getContext(), mFragmentFavorite.class); startActivity(intent);La actividad, el servicio y la aplicación amplían la clase ContextWrapper para que pueda usar esto o getContext () o getApplicationContext () en lugar del primer argumento.
fuente
Yo uso esto en mi fragmento.
Button btn1 = (Button) thisLayout .findViewById(R.id.btnDb1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(getActivity(), otherActivity.class); ((MainActivity) getActivity()).startActivity(intent); } }); return thisLayout; }fuente
Puede que tenga que reemplazar getActivity () con MainActivity.this para aquellos que tienen problemas con esto.
fuente
Iniciar una nueva actividad desde un fragmento:
Intent intent = new Intent(getActivity(), TargetActivity.class); startActivity(intent);Iniciar una nueva actividad desde una actividad:
Intent intent = new Intent(this, TargetActivity.class); startActivity(intent);fuente
con Kotlin ejecuto este código:
requireContext().startActivity<YourTargetActivity>()fuente
None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context