Подтвердить что ты не робот

Начать операцию из фрагмента

У меня есть 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); и ошибка

Метод findViewById (int) - undefined для типа FavoriteActivity

EDIT:

Когда я нажимаю кнопку в фрагменте, чтобы начать действие, приложение отключается это мой 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)
4b9b3361

Ответ 1

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

UPDATE

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

public class mFragmentFavorite extends FragmentActivity{

Сделайте это вместо этого:

public class mFragmentFavorite extends Fragment {

Ответ 2

Вы должны использовать getActivity() для запуска действий из фрагментов

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

Кроме того, вы должны указывать классы с шапками: MFragmentActivity вместо MFragmentActivity.

Ответ 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;
}

Ответ 4

Если вы используете getActivity(), вам необходимо убедиться, что активность вызова добавлена ​​ уже. Если в таком случае активность не была добавлена, вы можете получить null, когда вы вызываете getActivity()

в таких случаях getContext() безопасен

тогда код для запуска активности будет слегка изменен, например,

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

Активность, служба и приложение расширяет класс ContextWrapper, поэтому вы можете использовать этот или getContext() или getApplicationContext() вместо первого аргумент.

Ответ 5

Возможно, вам придется заменить getActivity() на MainActivity.this для тех, у кого есть проблемы с этим.

Ответ 6

Начать новую активность с фрагмента:

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

Начать новое задание с занятия:

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

Ответ 7

с Kotlin я выполняю этот код:

requireContext().startActivity<YourTargetActivity>()