Start an activity from a fragment
Solution 1
mFragmentFavorite
in your code is a FragmentActivity
which is not the same thing as a Fragment
. That's why you're getting the type mismatch. Also, you should never call new
on an Activity
as that is not the proper way to start one.
If you want to start a new instance of mFragmentFavorite
, you can do so via an Intent
.
From a Fragment
:
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
From an Activity
Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);
If you want to start aFavorite
instead of mFragmentFavorite
then you only need to change out their names in the created Intent
.
Also, I recommend changing your class names to be more accurate. Calling something mFragmentFavorite
is improper in that it's not a Fragment
at all. Also, class declarations in Java typically start with a capital letter. You'd do well to name your class something like FavoriteActivity
to be more accurate and conform to the language conventions. You will also need to rename the file to FavoriteActivity.java if you choose to do this since Java requires class names match the file name.
UPDATE
Also, it looks like you actually meant formFragmentFavorite
to be a Fragment
instead of a FragmentActivity
based on your use of onCreateView
. If you want mFragmentFavorite
to be a Fragment
then change the following line of code:
public class mFragmentFavorite extends FragmentActivity{
Make this instead read:
public class mFragmentFavorite extends Fragment {
Solution 2
You should use getActivity()
to launch activities from fragments
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
Also, you should be naming classes with caps: MFragmentActivity
instead of mFragmentActivity
.
Solution 3
If you are using getActivity() then you have to make sure that the calling activity is added already. If activity has not been added in such case so you may get null when you call getActivity()
in such cases getContext() is safe
then the code for starting the activity will be slightly changed like,
Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);
Activity, Service and Application extends ContextWrapper class so you can use this or getContext() or getApplicationContext() in the place of first argument.
Solution 4
I use this in my fragment.
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;
}
Solution 5
Start new Activity From a Fragment:
Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);
Start new Activity From a Activity:
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
mXX
Updated on June 20, 2020Comments
-
mXX almost 4 years
I have 2 fragments with on both fragments a button. When I press the button I'd like to start a new Activity. But I can't get it to work.
The error I'm getting: ERROR here: Type mismatch: cannot convert from mFragmentFavorite to Fragment
What am I doing wrong?
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; } }
If FavoriteActivity extends fragments, the error is gone but then I get an error at
findViewById(R.id.mainFavorite);
and the error isThe method findViewById(int) is undefined for the type FavoriteActivity
EDIT:
When I press the button in the fragment to start the activity then the app crashes this is my 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)
-
mXX about 11 yearsOkay, I'll update the code in the first post. But I don't quite understand the mContextReference. I'll update the code with what I have and better names, give me 5 min
-
Michael Celey about 11 yearsIt's an example of a reference to a
Fragment
or anActivity
. If you're using the code inside of one of those classes then you can just replacemContextReference
with eithergetActivity()
forFragment
orthis
forActivity
on the first line andthis
for the second line. I'll update the answer to be more clear. -
mXX about 11 yearsOkay, I updated the question with better names and the advice you gave me. I'll try now to implement your suggestion to try and make it work. Thanks for the help
-
mXX about 11 yearsYeah I've changed it back to Fragment but I get the error on the btn to find the ID "The method findViewById(int) is undefined for the type FavoriteActivity"
-
Michael Celey about 11 yearsIf you make it a
Fragment
then changefindViewById
tov.findViewById
. There is nofindViewById
function inFragment
so you have to callgetView
first then callfindViewById
on that. In your case though, you already have your view inonCreateView
and that would be your variablev
. -
mXX about 11 yearsI understand thanks. But when I press the btn to go to the new activity, the app crashes
-
Michael Celey about 11 yearsMake sure your new
Activity
is registered in your manifest. If your original question has been answered here then I'd suggest marking an answer as accepted by clicking the check mark beneath the voting arrows and asking a new question outlining the error/crash you're getting with a copy of the stack trace. Here's a good place to start with your crash though: stackoverflow.com/questions/4481903/… -
Confuse over 9 yearsI get nulllpointerexception. My activity is registered in manifest.
-
4127157 over 7 yearsDo you add a
finish();
in the end or you don't? -
Michael Celey over 7 yearsCalling
finish()
is entirely use case based. If you're trying to start a new activity while closing the current one, then yes. However, that breaks the stack-based navigation that you get with activities so you have to make sure that you really want to do that instead of maybe finding a better navigation pattern. Now if you're referring to closing the new activity after it's been started, you can do so in code with thefinish()
method or the user can utilize the back button to close the newly started activity. -
Palak Jain about 5 years'If you are using getActivity() then you have to make sure that the calling activity is added already.'- What does this line mean to a newbie?
-
Jayakrishnan about 5 years@PalakJain That means activity's state (Active to Destroyed) keep on changing depending on x reasons. An activity should be in active state when you perform anything on it. Activity is in active state if its life in between onResume and onPause.
-
Palak Jain about 5 yearsWell, that makes sense. Thanks!
-
Tim over 3 yearsWhen I try this code I get:
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
-
Edric over 3 years@Tim You'll probably need the Android KTX in order for the code to work.
-
midou about 3 yearsgetContext().startActivity(new Intent(getContext(), ActivityB.class));
-
Etienne Kaiser about 3 yearsDon't forget to declare also the
Activity
in yourAndroidManifest.xml
like that:<activity android:name="com.example.Appname.YourActivity" />