59

我有两个片段与两个片段的一个按钮。当我按下按钮时,我想开始一个新的活动。但我无法让它工作。从片段开始活动

的错误我得到:这里错误:类型不匹配:不能从mFragmentFavorite转换到碎片

我在做什么错?

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) 
+3

也许你不应该扩展FragmentActivity而是Fragment? – span 2013-03-18 13:35:04

+1

那么,对于一个你不使用'片段'。您发布的代码中至少没有。 – adneal 2013-03-18 13:35:06

回答

176

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要求类名与文件名匹配。

UPDATE

此外,它看起来像你实际上意味着mFragmentFavorite是一个Fragment而不是FragmentActivity根据您所使用的onCreateView。如果你想mFragmentFavorite成为Fragment然后更改下面的代码行:

public class mFragmentFavorite extends FragmentActivity{ 

让这个代替阅读:

public class mFragmentFavorite extends Fragment { 
+0

好的,我会在第一篇文章中更新代码。但我不太了解mContextReference。我会用我拥有的和更好的名字更新代码,给我5分 – mXX 2013-03-18 14:56:40

+0

这是一个引用“片段”或“活动”的例子。如果你在其中一个类中使用代码,那么你可以在第一行用'getActivity()'代替'Fragment'或'this'代替'mContextReference','this'代替第二行。我会更新答案,以便更清楚。 – MCeley 2013-03-18 15:00:49

+0

好的,我用更好的名字和你给我的建议更新了这个问题。我现在试着实施你的建议,试着让它工作。感谢您的帮助 – mXX 2013-03-18 15:10:01

19

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

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

此外,你应该命名上限类:MFragmentActivity而不是mFragmentActivity

+2

简短而甜美。 – offset 2014-10-27 09:52:20

2

我在我的片段中使用了这个。

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

如果您正在使用getActivity(),那么你必须确保调用活动添加了。如果活动尚未在这种情况下添加,所以你可能会得到当你调用getActivity()

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

然后启动该活动的代码将稍微变了样,

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

活动,服务和应用程序扩展ContextWrapper类,所以你可以使用这个getContext()getApplicationContext()代替第一个参数。