両方のフラグメントにボタンがある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);
でエラーが発生し、エラーは
メソッドFavoriteViewById(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
のようにすると、より正確になり、言語規則に準拠することができます。 Javaではクラス名がファイル名と一致する必要があるため、これを選択した場合は、ファイルの名前をFavoriteActivity.Javaに変更する必要があります。
UPDATE
また、mFragmentFavorite
の使用に基づいて、実際にforFragment
がFragmentActivity
ではなくonCreateView
であることを意図しているように見えます。 mFragmentFavorite
をFragment
にする場合は、次のコード行を変更します。
public class mFragmentFavorite extends FragmentActivity{
代わりにこれを読んでください:
public class mFragmentFavorite extends Fragment {
getActivity()
を使用して、フラグメントからアクティビティを起動する必要があります
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
また、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()を使用している場合、呼び出しアクティビティがaddedであることを確認する必要があります。そのような場合にアクティビティが追加されていないため、getActivity()を呼び出したときにnullを取得できます
そのような場合getContext()は安全です
アクティビティを開始するためのコードは、次のようにわずかに変更されます。
Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);
Activity、Service、およびApplicationはContextWrapperクラスを拡張するため、thisまたはgetContext()またはgetApplicationContext()を使用できます=最初の引数の場所
フラグメントから新しいアクティビティを開始:
Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);
アクティビティから新しいアクティビティを開始:
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
これに問題がある場合は、getActivity()をMainActivity.thisに置き換える必要があります。
kotlinでこのコードを実行します:
requireContext().startActivity<YourTargetActivity>()