Почніть діяльність із фрагмента


91

У мене є 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;
    }
}

Улюблена діяльність

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?
проліт

1
Ну, для тієї, яку ви не використовуєте Fragments. Принаймні ні в коді, який ви опублікували.
adneal

Відповіді:


247

mFragmentFavoriteу вашому коді є a, FragmentActivityщо не те саме, що a 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щоб бути точнішим і відповідати мовним умовам. Вам також потрібно буде перейменувати файл у FavoriteActivity.java, якщо ви вирішите це зробити, оскільки Java вимагає, щоб імена класів відповідали імені файлу.

ОНОВЛЕННЯ

Крім того, схоже, ви насправді мали mFragmentFavoriteнамір бути Fragmentзамість того, щоб FragmentActivityбазуватися на вашому використанні onCreateView. Якщо ви хочете mFragmentFavoriteстати, Fragmentтоді змініть такий рядок коду:

public class mFragmentFavorite extends FragmentActivity{

Зробіть це замість цього прочитаним:

public class mFragmentFavorite extends Fragment {

Гаразд, я оновлю код у першому дописі. Але я не зовсім розумію mContextReference. Я
оновлю

Це приклад посилання на a Fragmentабо an Activity. Якщо ви використовуєте код всередині одного з цих класів , то ви можете просто замінити mContextReferenceабо getActivity()на Fragmentабо thisдля Activityна першій лінії і thisдругої лінії. Я оновлю відповідь, щоб бути більш зрозумілою.
Майкл Селі

Гаразд, я оновив запитання кращими іменами та порадами, які ви мені дали. Зараз я спробую реалізувати вашу пропозицію, щоб спробувати змусити її працювати. Дякуємо за допомогу
mXX

Так, я змінив його на Fragment, але я отримую помилку на btn, щоб знайти ідентифікатор "Метод findViewById (int) не визначений для типу FavoriteActivity"
mXX

2
Якщо ви зробите це, Fragmentто змініть findViewByIdна v.findViewById. findViewByIdФункція відсутня, Fragmentтому спочатку потрібно зателефонувати, getViewа потім зателефонувати findViewByIdза цим. Однак у вашому випадку у вас вже є свій погляд, onCreateViewі це буде вашою змінною v.
Michael Celey

20

Вам слід використовувати getActivity()для запуску дії з фрагментів

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

Крім того, ви повинні називати класи заглавними буквами: MFragmentActivityзамість mFragmentActivity.


4

Якщо ви використовуєте getActivity (), то вам слід переконатися, що виклична дія вже додана . Якщо в такому випадку активність не була додана, тому ви можете отримати нуль при дзвінку getActivity ()

у таких випадках getContext () безпечний

тоді код для початку діяльності буде трохи змінений, як,

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

Activity, Service і Application розширює клас ContextWrapper, щоб ви могли використовувати це або getContext () або getApplicationContext () замість першого аргументу.


'Якщо ви використовуєте getActivity (), то ви повинні переконатися, що виклик вже доданий.' - Що цей рядок означає для новачка?
Палак Джайн

@PalakJain Це означає, що стан активності (Активний до Знищений) постійно змінюється залежно від х причин. Діяльність повинна бути в активному стані, коли ви виконуєте щось із нею. Діяльність знаходиться в активному стані, якщо її життя знаходиться між onResume і onPause.
Джаякрішнан

Ну, це має сенс. Дякую!
Palak Jain

3

Я використовую це у своєму фрагменті.

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

0

Можливо, вам доведеться замінити getActivity () на MainActivity. Це для тих, хто має проблеми з цим.


0

Почати нову активність із фрагмента:

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

Почати нову активність з активності:

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

0

з Kotlin я виконую цей код:

requireContext().startActivity<YourTargetActivity>()


Коли я пробую цей код, я отримую: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 Вам напевно знадобиться Android KTX, щоб код працював.
Едрік,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.