Начать операцию из фрагмента
У меня есть 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)
Ответы
Ответ 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>()