【问题标题】: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。至少在您发布的代码中没有。

标签: android android-fragments android-activity android-fragmentactivity


【解决方案1】:

您的代码中的mFragmentFavoriteFragmentActivity,与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 分钟
  • 这是对FragmentActivity 的引用示例。如果您在其中一个类中使用代码,那么您可以将mContextReference 替换为getActivity() 用于Fragmentthis 用于Activity 在第一行和this 用于第二行.我会更新答案以更清楚。
  • 好的,我用更好的名字和你给我的建议更新了这个问题。我现在将尝试实施您的建议以尝试使其发挥作用。感谢您的帮助
  • 是的,我已将其改回 Fragment,但我在 btn 上收到错误以查找 ID“FavoriteActivity 类型的方法 findViewById(int) 未定义”
  • 如果您将其设为Fragment,则将findViewById 更改为v.findViewByIdFragment 中没有 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));
          猜你喜欢
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多