从片段开始一个活动
我有两个片段与两个片段一个button。 当我按下button,我想开始一个新的活动。 但是我无法让它工作。
我得到的错误: 错误在这里:types不匹配:不能从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; } }
最喜欢的活动
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(R.id.mainFavorite);
和错误是
types为FavoriteActivity的findViewById(int)方法未定义
代码中的mFragmentFavorite
是一个FragmentActivity
,与Fragment
。 这就是为什么你得到types不匹配。 另外,你不应该在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
那么你只需要在创build的Intent
更改他们的名字。
另外,我build议改变你的类名更加准确。 调用mFragmentFavorite
是不合适的,因为它不是Fragment
。 另外,Java中的类声明通常以大写字母开头。 你最好把你的类命名为FavoriteActivity
,以便更准确和符合语言习惯。 如果您select这样做,您还需要将文件重命名为FavoriteActivity.java,因为Java需要类名称与文件名匹配。
UPDATE
另外,它看起来像你实际上意味着mFragmentFavorite
是一个Fragment
而不是基于你的onCreateView
的使用FragmentActivity
。 如果你想mFragmentFavorite
是一个Fragment
然后更改下面的代码行:
public class mFragmentFavorite extends FragmentActivity{
让这个改为:
public class mFragmentFavorite extends Fragment {
您应该使用getActivity()
从片段中启动活动
Intent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);
另外,你应该用caps命名类: MFragmentActivity
而不是mFragmentActivity
。
我在我的片段中使用这个。
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);
Activity,Service和Application扩展了ContextWrapper类,因此您可以在第一个参数的位置使用this , getContext()或getApplicationContext() 。