1. ホーム
  2. android

[解決済み] フラグメントからアクティビティを開始する

2022-02-02 06:49:31

質問

2つのフラグメントがあり、両方のフラグメントにボタンがあります。ボタンを押すと、新しいアクティビティを開始したいと思います。しかし、うまくいきません。

エラーは ここでERROR。型の不一致: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;
    }
}

お気に入りアクティビティ

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がfragmentsを拡張すると、エラーはなくなりますが、その後に、以下の場所でエラーが発生します。 findViewById(R.id.mainFavorite); であり、そのエラーは

メソッド findViewById(int) is undefined for the type お気に入りアクティビティ

EDITです。

フラグメントのボタンを押してアクティビティを開始すると、アプリがクラッシュします。 これは私のログキャットです

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にファイル名を変更する必要があります。

アップデイト

また、実際には mFragmentFavorite にすることで Fragment ではなく FragmentActivity を使用することに基づいています。 onCreateView . もし mFragmentFavorite になるように Fragment であれば、次の行を変更してください。

public class mFragmentFavorite extends FragmentActivity{

これを代わりに読ませる。

public class mFragmentFavorite extends Fragment {