Bir parçadan bir aktivite başlatın


91

Her iki parçada da bir düğme bulunan 2 parçam var. Düğmeye bastığımda yeni bir Aktivite başlatmak istiyorum. Ama işe alamıyorum.

Aldığım hata: HATA burada: Tür uyuşmazlığı: mFragmentFavorite'den Fragment'a dönüştürülemiyor

Neyi yanlış yapıyorum?

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

Favori aktivite

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 parçaları genişletirse, hata gider ancak daha sonra konumunda bir hata alıyorum findViewById(R.id.mainFavorite);ve hata

FindViewById (int) yöntemi, FavoriteActivity türü için tanımsızdır

DÜZENLE:

Etkinliği başlatmak için parçadaki düğmeye bastığımda uygulama çöküyor, bu benim logcat'im

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
Belki de FragmentActivity'yi değil, Fragment'ı genişletmelisiniz?
yayılma

1
Biri için kullanmıyorsun Fragments. En azından gönderdiğiniz kodda yok.
adneal

Yanıtlar:


248

mFragmentFavoritekodunuzda a FragmentActivityile aynı şey olmayan bir Fragment. Bu yüzden tip uyuşmazlığı yaşıyorsunuz. Ayrıca, newbir Activitytane başlatmak için uygun bir yol olmadığı için asla bir çağrıda bulunmamalısınız.

Yeni bir örneğini başlatmak mFragmentFavoriteistiyorsanız, bunu bir Intent.

Bir Fragment:

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

Bir Activity

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

aFavoriteBunun yerine başlamak mFragmentFavoriteistiyorsanız, sadece yaratılan adlarını değiştirmeniz gerekir Intent.

Ayrıca, daha doğru olması için sınıf adlarınızı değiştirmenizi tavsiye ederim. Bir şeyi aramak mFragmentFavorite, hiç de uygunsuz olduğundan uygunsuzdur Fragment. Ayrıca, Java'daki sınıf bildirimleri genellikle büyük harfle başlar. Sınıfınıza FavoriteActivitydaha doğru ve dil kurallarına uymak gibi bir ad vermeniz iyi olur . Java, sınıf adlarının dosya adıyla eşleşmesini gerektirdiğinden, bunu yapmayı seçerseniz, dosyayı FavoriteActivity.java olarak yeniden adlandırmanız gerekecektir.

GÜNCELLEME

Ayrıca, kullanımınıza bağlı mFragmentFavoriteolarak aslında a Fragmentyerine a olmayı kastetmişsiniz gibi görünüyor . İsterseniz olmak için daha sonra aşağıdaki kod satırını değiştirin:FragmentActivityonCreateViewmFragmentFavoriteFragment

public class mFragmentFavorite extends FragmentActivity{

Bunun yerine şunu okuyun:

public class mFragmentFavorite extends Fragment {

Tamam, ilk gönderideki kodu güncelleyeceğim. Ancak mContextReference'ı tam olarak anlamıyorum. Kodu sahip olduğum ve daha iyi isimlerle güncelleyeceğim, bana 5 dakika verin
mXX

Bu, a Fragmentveya an için bir referans örneğidir Activity. Bu sınıflardan birinin içindeki kodu kullanıyorsanız, ilk satırda ve ikinci satırda for veya for mContextReferenceile değiştirebilirsiniz . Daha net olması için cevabı güncelleyeceğim. getActivity()FragmentthisActivitythis
Michael Celey

Tamam, soruyu daha iyi isimlerle ve bana verdiğin tavsiyelerle güncelledim. Şimdi önerinizi uygulamaya ve işe yaramaya çalışacağım. Yardım için teşekkürler
mXX

Evet, onu Fragment olarak değiştirdim ancak btn'de "findViewById (int) yöntemi FavoriteActivity türü için tanımsız" kimliğini bulmak için hata alıyorum
mXX

2
Bunu bir yaparsanız Fragmento zaman değişim findViewByIdiçin v.findViewById. İçinde findViewByIdişlev yok , Fragmentbu yüzden getViewönce aramanız findViewById, sonra aramanız gerekir . Sizin durumunuzda yine de, görüşünüz zaten var onCreateViewve bu sizin değişkeniniz olacaktır v.
Michael Celey

21

getActivity()Parçalardan etkinlik başlatmak için kullanmalısınız

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

Ayrıca, sınıfları büyük harfle adlandırmanız gerekir: MFragmentActivityyerine mFragmentActivity.


4

GetActivity () kullanıyorsanız , arama etkinliğinin zaten eklendiğinden emin olmalısınız . Böyle bir durumda aktivite eklenmemişse, getActivity () 'yi çağırdığınızda boş alabilirsiniz.

bu gibi durumlarda getContext () güvenlidir

daha sonra aktiviteyi başlatma kodu biraz değişecektir,

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

Kullanmak böylece Aktivite, Hizmet ve Uygulama ContextWrapper sınıfını genişleten bu ya getContext () veya getApplicationContext () ilk argüman yerine.


'GetActivity () kullanıyorsanız, arama etkinliğinin önceden eklendiğinden emin olmalısınız.' - Bu satır bir acemi için ne anlama geliyor?
Palak Jain

@PalakJain Bu, aktivitenin durumunun (Aktif'ten Yok Edildi) x nedene bağlı olarak değişmeye devam ettiği anlamına gelir. Üzerinde herhangi bir şey yaptığınızda bir aktivite aktif durumda olmalıdır. Kullanım ömrü onResume ve onPause arasında ise aktivite aktif durumdadır.
Jayakrishnan

Bu mantıklı. Teşekkürler!
Palak Jain

3

Bunu parçamda kullanıyorum.

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

Bir Parçadan Yeni Etkinlik Başlatın:

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

Bir Aktiviteden Yeni Aktivite Başlatın:

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

0

Bununla ilgili sorunları olanlar için getActivity () 'yi MainActivity.this ile değiştirmeniz gerekebilir.


0

Kotlin ile bu kodu çalıştırıyorum:

requireContext().startActivity<YourTargetActivity>()


Bu kodu denediğimde şunu elde ederim: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 Kodun çalışması için muhtemelen Android KTX'e ihtiyacınız olacak.
Edric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.