Запуск активности из фрагмента
у меня есть 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) не определен для типа
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.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)
5 ответов:
mFragmentFavoriteв вашем коде этоFragmentActivityэто не то же самое какFragment. Вот почему вы получаете несоответствие типов. Кроме того, вы никогда не должны называтьnewнаActivityкак это не правильный способ, чтобы начать.если вы хотите запустить новый экземпляр
mFragmentFavorite, вы можете сделать это с помощьюIntent.С
Fragment:Intent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);С
ActivityIntent intent = new Intent(this, mFragmentFavorite.class); startActivity(intent);если вы хотите старт
aFavoriteвместоmFragmentFavoriteтогда вам нужно только изменить их имена в созданномIntent.также, я рекомендую изменить имена классов, чтобы быть более точным. Зовет что-то
mFragmentFavoriteнеправильно в том, что это неFragmentна всех. Кроме того, объявления классов в Java обычно начинаются с заглавной буквы. Вы бы хорошо назвали свой класс что-то вроде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);деятельность, обслуживание и применение расширяет класс ContextWrapper, так что вы можете использовать этой или getContext () или getApplicationContext() вместо первого аргумента.
возможно, вам придется заменить getActivity () на MainActivity.это для тех, у кого возникли проблемы с этим.
Comments