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

У меня есть 2 фрагмента, на обоих фрагментах кнопка. Когда я нажимаю кнопку, я бы хотел начать новую активность. Но я не могу заставить его работать.

Ошибка, которую я получаю: ERROR здесь: Тип несоответствия: невозможно преобразовать из 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; } } 

Если findViewById(R.id.mainFavorite); FavoriteActivity расширяет фрагменты, ошибка исчезла, но затем я обнаружил ошибку в findViewById(R.id.mainFavorite); И ошибка

Метод findViewById (int) не определен для типа FavoriteActivity

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 { 

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

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

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

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

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

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

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

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

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

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