เริ่มกิจกรรมจากส่วนย่อย


92

ฉันมีชิ้นส่วน 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;
    }
}

หาก 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

คำตอบ:


252

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 {

โอเคฉันจะอัปเดตโค้ดในโพสต์แรก แต่ฉันไม่ค่อยเข้าใจ mContextReference ฉันจะอัปเดตรหัสเป็นสิ่งที่ฉันมีและชื่อที่ดีกว่านี้ให้เวลาฉัน 5 นาที
mXX

เป็นตัวอย่างของการอ้างอิงถึง a FragmentหรือActivity. หากคุณกำลังใช้รหัสภายในหนึ่งในคลาสเหล่านั้นคุณสามารถแทนที่mContextReferenceด้วยgetActivity()สำหรับFragmentหรือthisสำหรับActivityในบรรทัดแรกและthisสำหรับบรรทัดที่สอง ฉันจะอัปเดตคำตอบให้ชัดเจนยิ่งขึ้น
Michael Celey

โอเคฉันอัปเดตคำถามด้วยชื่อที่ดีขึ้นและคำแนะนำที่คุณให้ฉัน ตอนนี้ฉันจะพยายามนำคำแนะนำของคุณไปใช้เพื่อให้ได้ผล ขอบคุณสำหรับความช่วยเหลือ
mXX

ใช่ฉันเปลี่ยนกลับเป็น Fragment แล้ว แต่ฉันได้รับข้อผิดพลาดใน btn เพื่อค้นหา ID "วิธี findViewById (int) ไม่ได้กำหนดไว้สำหรับประเภท FavoriteActivity"
mXX

2
ถ้าคุณทำมันให้Fragmentเปลี่ยนfindViewByIdเป็นv.findViewById. ไม่มีfindViewByIdฟังก์ชั่นFragmentดังนั้นคุณต้องโทรgetViewก่อนจากนั้นจึงโทรfindViewByIdไปที่ ในกรณีของคุณแม้ว่าคุณมีอยู่แล้วในมุมมองของคุณและที่จะตัวแปรของคุณonCreateView v
Michael Celey

21

คุณควรใช้getActivity()เพื่อเปิดกิจกรรมจากส่วนย่อย

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

นอกจากนี้คุณควรจะได้รับการตั้งชื่อชั้นเรียนที่มีหมวก: แทนMFragmentActivitymFragmentActivity


4

หากคุณใช้getActivity ()คุณต้องตรวจสอบให้แน่ใจว่าได้เพิ่มกิจกรรมการโทรแล้ว หากไม่ได้เพิ่มกิจกรรมในกรณีนี้ดังนั้นคุณอาจได้รับค่าว่างเมื่อคุณเรียกgetActivity ()

ในกรณีเช่นนี้getContext ()ปลอดภัย

จากนั้นรหัสสำหรับเริ่มกิจกรรมจะเปลี่ยนไปเล็กน้อยเช่น

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

กิจกรรมบริการและแอปพลิเคชันขยายคลาส ContextWrapper เพื่อให้คุณสามารถใช้สิ่งนี้หรือgetContext ()หรือgetApplicationContext ()แทนอาร์กิวเมนต์แรก


'หากคุณใช้ getActivity () คุณต้องแน่ใจว่าได้เพิ่มกิจกรรมการโทรแล้ว' - บรรทัดนี้มีความหมายอย่างไรกับมือใหม่?
Palak Jain

@PalakJain นั่นหมายถึงสถานะของกิจกรรม (Active to Destroyed) เปลี่ยนแปลงไปเรื่อย ๆ ขึ้นอยู่กับเหตุผล x กิจกรรมควรอยู่ในสถานะใช้งานได้เมื่อคุณดำเนินการใด ๆ กิจกรรมอยู่ในสถานะใช้งานได้หากอายุการใช้งานอยู่ระหว่าง onResume และ onPause
Jayakrishnan

นั่นก็สมเหตุสมผลดี ขอบคุณ!
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

เริ่มกิจกรรมใหม่จาก Fragment:

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

เริ่มกิจกรรมใหม่จากกิจกรรม:

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

0

คุณอาจต้องแทนที่ getActivity () ด้วย MainActivity สำหรับผู้ที่มีปัญหานี้


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.