조각에서 활동 시작


91

두 조각에 버튼이 두 개 있습니다. 버튼을 누르면 새로운 활동을 시작하고 싶습니다. 그러나 나는 그것을 작동시킬 수 없습니다.

내가 얻는 오류 : ERROR here : Type mismatch : cannot convert from mFragmentFavorite to 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) 메소드는 FavoriteActivity 유형에 대해 정의되지 않았습니다.

편집하다:

조각의 버튼을 눌러 활동을 시작하면 앱이 충돌합니다. 이것이 내 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)

3
아마도 FragmentActivity가 아니라 Fragment를 확장해야할까요?
스팬

1
글쎄, 당신은 사용하지 않는 Fragments. 귀하가 게시 한 코드에는 적어도 없습니다.
adneal 2013 년

답변:


251

mFragmentFavorite귀하의 코드 FragmentActivity에서는 Fragment. 이것이 유형 불일치가 발생하는 이유입니다. 또한, 전화를해서는 안 newActivity그 일을 시작하는 적절한 방법이 아니다한다.

의 새 인스턴스를 시작 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는 클래스 이름이 파일 이름과 일치해야하므로이를 선택하면 파일 이름을 FavoriteActivity.java로 변경해야합니다.

최신 정보

당신이 실제로 의미처럼 또한, 보이는 mFragmentFavoriteFragment대신 FragmentActivity의 사용에 따라 onCreateView. 당신이 mFragmentFavorite되고 싶다면 Fragment다음 코드 줄을 변경하십시오.

public class mFragmentFavorite extends FragmentActivity{

대신 이것을 읽으십시오.

public class mFragmentFavorite extends Fragment {

좋습니다. 첫 번째 게시물에서 코드를 업데이트하겠습니다. 그러나 나는 mContextReference를 잘 이해하지 못합니다. 내가 가진 코드와 더 나은 이름으로 코드를 업데이트하겠습니다. 5
분만

Fragment또는 에 대한 참조의 예입니다 Activity. 당신이 그 클래스 중 하나의 코드 내부를 사용하는 경우 다음 당신은 대체 할 수 있습니다 mContextReference중 하나에 getActivity()대한 Fragment또는 this에 대한 Activity첫 번째 행과 this두 번째 라인. 더 명확하게 답변을 업데이트하겠습니다.
Michael Celey

알겠습니다. 더 나은 이름과 조언으로 질문을 업데이트했습니다. 나는 지금 그것을 시도하고 작동하도록 당신의 제안을 구현하려고 노력할 것입니다. 도움을 주셔서 감사합니다
mXX

예, 다시 Fragment로 변경했지만 btn에 오류가 발생하여 "FavouriteActivity 유형에 대해 findViewById (int) 메서드가 정의되지 않았습니다."라는 ID를 찾습니다.
mXX

2
당신이 그것을 할 경우, Fragment다음 변화 findViewByIdv.findViewById. 더 없다 findViewById함수 Fragment는 호출해야하므로 getView먼저 전화 findViewById그것에는. 귀하의 경우에는 이미 귀하의 견해 onCreateView가 있으며 귀하의 변수가 될 것입니다 v.
Michael Celey

21

getActivity()조각에서 활동을 시작 하는 데 사용해야 합니다.

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

또한 클래스 이름 MFragmentActivitymFragmentActivity. 대신 caps :로 지정해야합니다 .


4

getActivity () 를 사용 하는 경우 호출 활동이 이미 추가 되었는지 확인해야합니다 . 이러한 경우 활동이 추가되지 않았으므로 getActivity () 를 호출 할 때 null이 될 수 있습니다.

이러한 경우 getContext () 는 안전합니다.

활동을 시작하는 코드는 다음과 같이 약간 변경됩니다.

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

Activity, Service 및 Application은 ContextWrapper 클래스를 확장하므로 첫 번째 인수 대신 this 또는 getContext () 또는 getApplicationContext () 를 사용할 수 있습니다 .


'getActivity ()를 사용하는 경우 호출 활동이 이미 추가되어 있는지 확인해야합니다 .'-이 줄은 초보자에게 어떤 의미입니까?
Palak Jain

@PalakJain 이것은 활동의 상태 (Active to Destroyed)가 x 이유에 따라 계속 변한다는 것을 의미합니다. 활동은 활동에 대해 수행 할 때 활성 상태 여야합니다. 활동이 onResume과 onPause 사이에 있으면 활동이 활성 상태입니다.
Jayakrishnan 2019

글쎄요. 감사!
Palak Jain

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

1

조각에서 새 활동 시작 :

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

활동에서 새 활동 시작 :

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

0

이 문제가있는 경우 getActivity ()를 MainActivity.this로 바꿔야 할 수 있습니다.


0

Kotlin으로이 코드를 실행합니다.

requireContext().startActivity<YourTargetActivity>()


이 코드를 시도하면 다음과 같은 결과가 나타납니다.None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context
Tim

@Tim 코드가 작동하려면 Android KTX 가 필요할 것입니다 .
Edric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.