从片段开始活动
Posted
技术标签:
【中文标题】从片段开始活动【英文标题】:Start an activity from a fragment 【发布时间】:2013-03-06 20:45:43 【问题描述】:我有 2 个片段,两个片段上都有一个按钮。当我按下按钮时,我想开始一个新的活动。但我无法让它工作。
我收到的错误:此处出现错误:类型不匹配:无法从 mFragmentFavorite 转换为 Fragment
我做错了什么?
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;
如果 FavoriteActivity 扩展片段,则错误消失,但随后我在findViewById(R.id.mainFavorite);
收到错误,错误是
findViewById(int) 方法未为该类型定义 收藏活动
编辑:
当我按下片段中的按钮启动活动时,应用程序崩溃 这是我的日志猫
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)
【问题讨论】:
也许你不应该扩展 FragmentActivity 而应该扩展 Fragment? 好吧,你没有使用Fragments
。至少在您发布的代码中没有。
【参考方案1】:
您的代码中的mFragmentFavorite
是FragmentActivity
,与Fragment
不同。这就是你得到类型不匹配的原因。此外,您永远不应该在Activity
上调用new
,因为这不是开始的正确方式。
如果您想启动mFragmentFavorite
的新实例,可以通过Intent
进行。
来自Fragment
:
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
来自Activity
Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);
如果你想开始aFavorite
而不是mFragmentFavorite
那么你只需要在创建的Intent
中更改他们的名字。
另外,我建议更改您的班级名称以更准确。调用 mFragmentFavorite
是不恰当的,因为它根本不是 Fragment
。此外,Java 中的类声明通常以大写字母开头。你最好将你的类命名为FavoriteActivity
这样更准确并符合语言约定。如果您选择这样做,您还需要将文件重命名为 FavoriteActivity.java,因为 Java 要求类名与文件名匹配。
更新
此外,根据您对onCreateView
的使用,您似乎实际上是想让mFragmentFavorite
成为Fragment
而不是FragmentActivity
。如果您希望 mFragmentFavorite
成为 Fragment
,请更改以下代码行:
public class mFragmentFavorite extends FragmentActivity
改为改为:
public class mFragmentFavorite extends Fragment
【讨论】:
好的,我会在第一篇文章中更新代码。但我不太了解 mContextReference。我会用我拥有的和更好的名字更新代码,给我 5 分钟 这是对Fragment
或Activity
的引用示例。如果您在其中一个类中使用代码,那么您可以将mContextReference
替换为getActivity()
用于Fragment
或this
用于Activity
在第一行和this
用于第二行.我会更新答案以更清楚。
好的,我用更好的名字和你给我的建议更新了这个问题。我现在将尝试实施您的建议以尝试使其发挥作用。感谢您的帮助
是的,我已将其改回 Fragment,但我在 btn 上收到错误以查找 ID“FavoriteActivity 类型的方法 findViewById(int) 未定义”
如果您将其设为Fragment
,则将findViewById
更改为v.findViewById
。 Fragment
中没有 findViewById
函数,因此您必须先调用 getView
,然后再调用 findViewById
。但是,在您的情况下,您已经在 onCreateView
中拥有您的视图,这将是您的变量 v
。【参考方案2】:
您应该使用getActivity()
从片段中启动活动
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
此外,您应该使用大写字母命名类:MFragmentActivity
而不是 mFragmentActivity
。
【讨论】:
【参考方案3】:如果您使用的是 getActivity(),那么您必须确保调用活动已添加。如果在这种情况下没有添加活动,那么当你调用 getActivity()
时你可能会得到 null在这种情况下 getContext() 是安全的
那么启动活动的代码会稍微改变一下,
Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);
Activity、Service 和 Application 扩展了 ContextWrapper 类,因此您可以在第一个参数的位置。
【讨论】:
'如果你正在使用 getActivity() 那么你必须确保调用活动已经被添加。'- 这行对新手意味着什么? @PalakJain 这意味着活动的状态(活动到销毁)会根据 x 原因不断变化。当您对其执行任何操作时,活动应该处于活动状态。如果 Activity 的生命周期介于 onResume 和 onPause 之间,则 Activity 处于活动状态。 嗯,这是有道理的。谢谢!【参考方案4】:我在我的片段中使用它。
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;
【讨论】:
【参考方案5】:从片段开始新的活动:
Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);
从 Activity 开始新的 Activity:
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
【讨论】:
【参考方案6】:您可能需要将 getActivity() 替换为 MainActivity.this 来解决问题。
【讨论】:
【参考方案7】:我使用 Kotlin 执行以下代码:
requireContext().startActivity<YourTargetActivity>()
【讨论】:
当我尝试这段代码时,我得到: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
@Tim 您可能需要Android KTX 才能使代码正常工作。
getContext().startActivity(new Intent(getContext(), ActivityB.class));以上是关于从片段开始活动的主要内容,如果未能解决你的问题,请参考以下文章