从片段开始活动


91

我有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;
    }
}

最喜欢的活动

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);错误是

对于FavoriteActivity类型,未定义方法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)

3
也许您不应该扩展FragmentActivity而是Fragment?
跨度

1
恩,您没有使用过Fragments。您发布的代码中至少没有。
adneal 2013年

Answers:


247

mFragmentFavorite在您的代码中FragmentActivity与是不一样的Fragment。这就是为什么类型不匹配的原因。此外,你永远不应该叫newActivity因为这不是启动它的正确方法。

如果要启动的新实例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要求类名与文件名匹配。

更新

另外,看起来您实际上打算mFragmentFavorite成为Fragment而不是FragmentActivity根据您对的使用onCreateView。如果要mFragmentFavorite成为a,Fragment则更改以下代码行:

public class mFragmentFavorite extends FragmentActivity{

将其改为:

public class mFragmentFavorite extends Fragment {

好的,我将在第一篇文章中更新代码。但是我不太了解mContextReference。我将使用自己拥有的更好的名称来更新代码,给我5分钟
mXX 2013年

这是引用Fragment或的示例Activity。如果您在其中一个类中使用代码,则只需在第一行和第二行mContextReference中用getActivity()forFragmentthisfor替换即可。我将更新答案以使其更加清晰。Activitythis
Michael Celey

好的,我用更好的名字和您给我的建议来更新问题。现在,我将尝试实施您的建议,以使其切实可行。感谢您的帮助
mXX 2013年

是的,我将其更改回了Fragment,但在btn上遇到了错误,以找到ID“对于FavoriteActivity类型,未定义方法findViewById(int)”
mXX 2013年

2
如果设为a,Fragment则更findViewById改为v.findViewById。没有findViewById功能,Fragment因此您必须先调用getView然后再调用findViewById。不过,就您而言,您已经有了视图onCreateView,那将是您的variable v
Michael Celey

20

您应该用来getActivity()从片段启动活动

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

另外,您应该使用caps:MFragmentActivity而不是命名类mFragmentActivity


4

如果使用的是getActivity(),则必须确保已添加调用活动。如果在这种情况下未添加活动,则在调用getActivity()时可能会为null

在这种情况下,getContext()是安全的

然后,用于启动活动的代码将略有变化,例如,

Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);

活动,服务和应用程序扩展了ContextWrapper类,因此您可以在第一个参数的位置使用此类型getContext()getApplicationContext()


“如果您使用的是getActivity(),则必须确保已添加呼叫活动。”-这行对新手意味着什么?
Palak Jain

@PalakJain这意味着活动的状态(从活动到被销毁)根据x原因不断变化。当您对活动执行任何操作时,该活动应处于活动状态。如果活动处于onResume和onPause之间,则该活动处于活动状态。
Jayakrishnan

好吧,那很有意义。谢谢!
Palak Jain

3

我在片段中使用它。

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;
}

0

对于与此存在问题的用户,可能必须用MainActivity.this替换getActivity()。


0

从片段开始新的活动:

Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);

从活动开始新的活动:

Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);

0

使用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才能使代码正常工作。
埃德里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.