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()代替第一個參數。