อธิบายคำตอบของ Alex Volovoy ให้ละเอียดยิ่งขึ้น -
ในกรณีที่คุณได้รับปัญหานี้ด้วยชิ้นส่วน getActivity () ทำงานได้ดีเพื่อให้ได้บริบท
ในกรณีอื่น ๆ :
หากคุณไม่ต้องการใช้ -
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend
จากนั้นสร้างฟังก์ชันเช่นนี้ใน OutsideClass ของคุณ -
public void gettingContext(Context context){
real_context = context;//where real_context is a global variable of type Context
}
ตอนนี้ในกิจกรรมหลักของคุณเมื่อคุณทำการ OutsideClass ใหม่เรียกเมธอดด้านบนทันทีหลังจากที่คุณกำหนด OutsideClass ให้บริบทของกิจกรรมเป็นอาร์กิวเมนต์ ในกิจกรรมหลักของคุณ
public void startNewActivity(final String activity_to_start) {
if(activity_to_start.equals("ACTIVITY_KEY"));
//ACTIVITY_KEY-is a custom key,just to
//differentiate different activities
Intent i = new Intent(MainActivity.this, ActivityToStartName.class);
activity_context.startActivity(i);
}//you can make a if-else ladder or use switch-case
ตอนนี้กลับมาที่ OutsideClass ของคุณและเริ่มกิจกรรมใหม่ทำสิ่งนี้ -
@Override
public void onClick(View v) {
........
case R.id.any_button:
MainActivity mainAct = (MainActivity) real_context;
mainAct.startNewActivity("ACTIVITY_KEY");
break;
}
........
}
วิธีนี้คุณจะสามารถเริ่มต้นกิจกรรมที่แตกต่างกันที่เรียกว่า OutsideClass ที่แตกต่างกันโดยไม่ต้องยุ่งกับการตั้งค่าสถานะ
หมายเหตุ - พยายามอย่าแคชอ็อบเจ็กต์บริบทผ่านตัวสร้างสำหรับแฟรกเมนต์ (ด้วยอะแด็ปเตอร์มันใช้ได้) แฟรกเมนต์ A ควรมีคอนสตรัคเตอร์เปล่ามิฉะนั้นแอปพลิเคชันขัดข้องในบางสถานการณ์
อย่าลืมโทร
OutsideClass.gettingContext(Context context);
ในฟังก์ชั่น onResume () เช่นกัน