Запуск активности из фрагмента



у меня есть 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)
686   5  

5 ответов:

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 чтобы быть более точным и соответствовать языковых конвенций. Вам также нужно будет переименовать файл к любимому делу.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

    Ничего не найдено.