从片段开始活动

时间:2013-03-18 13:32:13

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

我有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)未定义类型   FavoriteActivity

修改

当我按下片段中的按钮开始活动时,应用程序崩溃了 这是我的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)

7 个答案:

答案 0 :(得分:207)

代码中的

mFragmentFavoriteFragmentActivity,与Fragment不同。这就是你得到类型不匹配的原因。此外,您永远不应该在new上拨打Activity,因为这不是正确的启动方式。

如果您要开始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。如果您希望mFragmentFavoriteFragment,请更改以下代码行:

public class mFragmentFavorite extends FragmentActivity{

请改为阅读:

public class mFragmentFavorite extends Fragment {

答案 1 :(得分:20)

您应该使用getActivity()从片段

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

此外,您应该使用大写字母命名类:MFragmentActivity而不是mFragmentActivity

答案 2 :(得分: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;
}

答案 3 :(得分:3)

如果您使用的是 getActivity(),则必须确保调用活动已经添加。如果在这种情况下未添加活动,那么当您致电 getActivity()

时,您可能会获得 null

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

然后启动活动的代码会稍微改变,如

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

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

答案 4 :(得分:0)

对于与此相关的问题,您可能必须用MainActivity.this替换getActivity()。

答案 5 :(得分:0)

从片段开始新活动:

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

从活动开始新的活动:

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

答案 6 :(得分:0)

使用Kotlin我执行以下代码:

requireContext().startActivity<YourTargetActivity>()