从片段开始活动
我有两个片段与两个片段的一个按钮。当我按下按钮时,我想开始一个新的活动。但我无法让它工作。从片段开始活动
的错误我得到:这里错误:类型不匹配:不能从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)
mFragmentFavorite
你的代码是FragmentActivity
,这与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要求类名与文件名匹配。
UPDATE
此外,它看起来像你实际上意味着mFragmentFavorite
是一个Fragment
而不是FragmentActivity
根据您所使用的onCreateView
。如果你想mFragmentFavorite
成为Fragment
然后更改下面的代码行:
public class mFragmentFavorite extends FragmentActivity{
让这个代替阅读:
public class mFragmentFavorite extends Fragment {
好的,我会在第一篇文章中更新代码。但我不太了解mContextReference。我会用我拥有的和更好的名字更新代码,给我5分 – mXX 2013-03-18 14:56:40
这是一个引用“片段”或“活动”的例子。如果你在其中一个类中使用代码,那么你可以在第一行用'getActivity()'代替'Fragment'或'this'代替'mContextReference','this'代替第二行。我会更新答案,以便更清楚。 – MCeley 2013-03-18 15:00:49
好的,我用更好的名字和你给我的建议更新了这个问题。我现在试着实施你的建议,试着让它工作。感谢您的帮助 – mXX 2013-03-18 15:10:01
您应该使用getActivity()
从片段启动活动
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
此外,你应该命名上限类:MFragmentActivity
而不是mFragmentActivity
。
简短而甜美。 – offset 2014-10-27 09:52:20
我在我的片段中使用了这个。
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;
}
如果您正在使用getActivity(),那么你必须确保调用活动添加了。如果活动尚未在这种情况下添加,所以你可能会得到空当你调用getActivity()
在这种情况下的getContext()安全
然后启动该活动的代码将稍微变了样,
Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);
活动,服务和应用程序扩展ContextWrapper类,所以你可以使用这个或getContext()或getApplicationContext()代替第一个参数。
也许你不应该扩展FragmentActivity而是Fragment? – span 2013-03-18 13:35:04
那么,对于一个你不使用'片段'。您发布的代码中至少没有。 – adneal 2013-03-18 13:35:06