Memulai aktivitas dari sebuah fragmen

91

Saya memiliki 2 fragmen dengan pada kedua fragmen sebuah tombol. Saat saya menekan tombol, saya ingin memulai Aktivitas baru. Tapi saya tidak bisa membuatnya bekerja.

Kesalahan yang saya dapatkan: ERROR di sini: Ketik mismatch: tidak dapat dikonversi dari mFragmentFavorite ke Fragment

Apa yang saya lakukan salah?

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;
    }
}

FavouriteActivity

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;
    }
}

Jika FavouriteActivity memperluas fragmen, kesalahannya hilang tetapi saya mendapatkan kesalahan findViewById(R.id.mainFavorite);dan kesalahannya hilang

Metode findViewById (int) tidak ditentukan untuk tipe FavoriteActivity

EDIT:

Ketika saya menekan tombol di fragmen untuk memulai aktivitas maka aplikasi macet ini adalah logcat saya

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)
mXX
sumber
3
Mungkin Anda sebaiknya tidak memperluas FragmentActivity melainkan Fragment?
rentang waktu
1
Nah, untuk yang tidak Anda gunakan Fragments. Setidaknya tidak ada dalam kode yang Anda posting.
adneal

Jawaban:

247

mFragmentFavoritedalam kode Anda ada FragmentActivityyang tidak sama dengan a Fragment. Itulah mengapa Anda mendapatkan jenis ketidakcocokan. Juga, Anda tidak harus memanggil newpada Activitysaat yang bukan cara yang tepat untuk memulai satu.

Jika Anda ingin memulai contoh baru mFragmentFavorite, Anda dapat melakukannya melalui Intent.

Dari Fragment:

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

Dari sebuah Activity

Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);

Jika Anda ingin memulai aFavoritedaripada mFragmentFavoritekemudian Anda hanya perlu mengubah nama mereka di buat Intent.

Juga, saya sarankan mengubah nama kelas Anda agar lebih akurat. Memanggil sesuatu mFragmentFavoriteitu tidak pantas karena itu Fragmentsama sekali bukan a . Juga, deklarasi kelas di Java biasanya dimulai dengan huruf kapital. Anda sebaiknya memberi nama kelas Anda sesuatu yang FavoriteActivitylebih akurat dan sesuai dengan konvensi bahasa. Anda juga perlu mengganti nama file menjadi FavoriteActivity.java jika Anda memilih untuk melakukan ini karena Java memerlukan nama kelas yang cocok dengan nama file.

MEMPERBARUI

Juga, sepertinya Anda benar-benar dimaksudkan untuk mFragmentFavoritemenjadi Fragmentbukan FragmentActivityberdasarkan penggunaan Anda onCreateView. Jika Anda ingin mFragmentFavoritemenjadi seorang Fragmentmaka ubah baris kode berikut:

public class mFragmentFavorite extends FragmentActivity{

Jadikan ini sebagai gantinya membaca:

public class mFragmentFavorite extends Fragment {
Michael Celey
sumber
Oke, saya akan update kodenya di postingan pertama. Tapi saya tidak begitu mengerti mContextReference. Saya akan memperbarui kode dengan apa yang saya miliki dan nama yang lebih baik, beri saya 5 menit
mXX
Ini adalah contoh referensi ke a Fragmentatau an Activity. Jika Anda menggunakan kode di dalam salah satu kelas tersebut, maka Anda dapat mengganti mContextReferencedengan getActivity()for Fragmentatau thisfor Activitydi baris pertama dan thisuntuk baris kedua. Saya akan mengupdate jawabannya agar lebih jelas.
Michael Celey
Oke, saya memperbarui pertanyaan dengan nama yang lebih baik dan saran yang Anda berikan kepada saya. Sekarang saya akan mencoba menerapkan saran Anda untuk mencoba dan membuatnya berhasil. Terima kasih atas bantuannya
mXX
Ya, saya telah mengubahnya kembali ke Fragment tetapi saya mendapatkan kesalahan di btn untuk menemukan ID "Metode findViewById (int) tidak ditentukan untuk jenis FavoriteActivity"
mXX
2
Jika Anda membuatnya, Fragmentubahlah findViewByIdmenjadi v.findViewById. Tidak ada findViewByIdfungsi yang masuk Fragmentjadi Anda harus menelepon getViewdulu baru memanggilnya findViewById. Namun dalam kasus Anda, Anda sudah memiliki view onCreateViewdan itu akan menjadi variabel Anda v.
Michael Celey
21

Anda harus menggunakan getActivity()untuk meluncurkan aktivitas dari fragmen

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

Selain itu, Anda harus memberi nama kelas dengan huruf besar: MFragmentActivitybukan mFragmentActivity.

pembohong
sumber
4

Jika Anda menggunakan getActivity () maka Anda harus memastikan bahwa aktivitas panggilan sudah ditambahkan . Jika aktivitas belum ditambahkan dalam kasus seperti itu, Anda mungkin mendapatkan null saat memanggil getActivity ()

dalam kasus seperti ini getContext () aman

maka kode untuk memulai aktivitas akan sedikit berubah seperti,

Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);

Aktivitas, Layanan, dan Aplikasi memperluas kelas ContextWrapper sehingga Anda bisa menggunakan ini atau getContext () atau getApplicationContext () sebagai pengganti argumen pertama.

Jayakrishnan
sumber
'Jika Anda menggunakan getActivity () maka Anda harus memastikan bahwa aktivitas panggilan sudah ditambahkan.' - Apa arti baris ini bagi pemula?
Palak Jain
@PalakJain Artinya status aktivitas (Aktif hingga Hancur) terus berubah tergantung alasan x. Suatu aktivitas harus dalam keadaan aktif ketika Anda melakukan apa pun di dalamnya. Aktivitas dalam status aktif jika masa aktifnya di antara onResume dan onPause.
Jayakrishnan
Yah, itu masuk akal. Terima kasih!
Palak Jain
3

Saya menggunakan ini dalam fragmen saya.

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;
}
Sara Zakizadeh
sumber
1

Mulai Aktivitas baru Dari Fragmen:

Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);

Memulai Aktivitas baru Dari Aktivitas:

Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
Abhay Bhusari
sumber
0

Anda mungkin harus mengganti getActivity () dengan MainActivity.ini untuk mereka yang mengalami masalah dengan ini.

ADL
sumber
0

dengan Kotlin saya menjalankan kode ini:

requireContext().startActivity<YourTargetActivity>()

Alexandr Kolesnik
sumber
Ketika saya mencoba kode ini saya mendapatkan:None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context
Tim
@Tim Anda mungkin memerlukan Android KTX agar kode dapat berfungsi.
Edric