it-swarm.com.ru

Начать деятельность с фрагмента

У меня есть 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) не определен для типа Любимое занятие

Правка:

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

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 требует, чтобы имена классов совпадали с именем файла.

ОБНОВЛЕНИЕ

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

public class mFragmentFavorite extends FragmentActivity{

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

public class mFragmentFavorite extends Fragment {
204
Michael Celey

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

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

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

20
liarspocker

Я использую это в моем фрагменте.

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

Если вы используете getActivity () , то вы должны убедиться, что вызывающее действие добавлено уже. Если в этом случае действие не было добавлено, вы можете получить null при вызове getActivity ()  

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

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

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

Activity, Service и Application расширяет класс ContextWrapper, чтобы вы могли использовать this или getContext () или getApplicationContext () вместо первого аргумента.

3
Jayakrishnan PM

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

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

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

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

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

0
ADL