ป้องกันการปิดกล่องโต้ตอบเมื่อหมุนหน้าจอใน Android


94

ฉันกำลังพยายามป้องกันไม่ให้กล่องโต้ตอบที่สร้างด้วยตัวสร้างการแจ้งเตือนถูกปิดเมื่อเริ่มกิจกรรมใหม่

หากฉันโอเวอร์โหลดเมธอด onConfigurationChanged ฉันสามารถทำสิ่งนี้ได้สำเร็จและรีเซ็ตเค้าโครงเพื่อแก้ไขการวางแนว แต่ฉันสูญเสียคุณสมบัติข้อความติดหนึบของ edittext ดังนั้นในการแก้ปัญหาการโต้ตอบฉันได้สร้างปัญหาแก้ไขข้อความนี้

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

ฉันต้องการแก้ปัญหาไดอะล็อกหรือปัญหาแก้ไขข้อความจริงๆ

ขอบคุณสำหรับความช่วยเหลือ


1
คุณบันทึก / กู้คืนเนื้อหาของ EditText ที่แก้ไขได้อย่างไร? คุณสามารถแสดงรหัสได้หรือไม่?
Peter Knego

ฉันพบปัญหาเกี่ยวกับสิ่งนั้นฉันลืมที่จะรับมุมมองอีกครั้งโดย Id หลังจากรีเซ็ตเค้าโครง
draksia

คำตอบ:


134

วิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหานี้ในปัจจุบันคือการใช้ไฟล์DialogFragment.

DialogFragmentสร้างคลาสใหม่ซึ่งทอดตัว ลบล้างonCreateDialogและส่งคืนไฟล์เก่าDialogหรือAlertDialogไฟล์.

DialogFragment.show(fragmentManager, tag)จากนั้นคุณสามารถแสดงด้วย

นี่คือตัวอย่างของListener:

public class MyDialogFragment extends DialogFragment {

    public interface YesNoListener {
        void onYes();

        void onNo();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (!(activity instanceof YesNoListener)) {
            throw new ClassCastException(activity.toString() + " must implement YesNoListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.dialog_my_title)
                .setMessage(R.string.dialog_my_message)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((YesNoListener) getActivity()).onYes();
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((YesNoListener) getActivity()).onNo();
                    }
                })
                .create();
    }
}

และในกิจกรรมที่คุณโทร:

new MyDialogFragment().show(getSupportFragmentManager(), "tag"); // or getFragmentManager() in API 11+

คำตอบนี้ช่วยอธิบายคำถามสามข้ออื่น ๆ เหล่านี้ (และคำตอบ):


มีปุ่มในแอพของฉันเพื่อโทร .how () ฉันต้องจำสถานะของกล่องโต้ตอบการแจ้งเตือนที่แสดง / ปิด มีวิธีเก็บกล่องโต้ตอบโดยไม่ต้องโทร .how () หรือไม่?
Alpha Huang

1
มันบอกว่าonAttachเลิกใช้แล้ว ควรทำอะไรแทน?
farahm

3
@faraz_ahmed_kamran คุณควรใช้onAttach(Context context)และandroid.support.v4.app.DialogFragment. ตอนonAttachนี้เมธอดใช้contextแทนactivityพารามิเตอร์
Stan Mots

อาจไม่จำเป็นสำหรับYesNoListenerแม้ว่า ดูคำตอบนี้
Mygod

46
// Prevent dialog dismiss when orientation changes
private static void doKeepDialog(Dialog dialog){
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(dialog.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    dialog.getWindow().setAttributes(lp);
}
public static void doLogout(final Context context){     
        final AlertDialog dialog = new AlertDialog.Builder(context)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.titlelogout)
        .setMessage(R.string.logoutconfirm)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ...   
            }

        })
        .setNegativeButton("No", null)      
        .show();    

        doKeepDialog(dialog);
    }

1
ใครพบว่ารหัสของฉันไม่มีประโยชน์ให้ลองใช้ก่อนคลิก :-)
Chung IW

6
ได้ผลไม่รู้เป็นอย่างไร แต่ได้ผล! ทำความสะอาดโซลูชันที่เรียบง่ายและเป็นนามธรรมขอบคุณ
nmvictor

3
ฉันคิดว่ารหัสนี้ไม่ดี doLogout () มีการอ้างอิงถึงบริบทซึ่งเป็น / มีกิจกรรม กิจกรรมนี้ไม่สามารถทำลายได้ซึ่งอาจทำให้หน่วยความจำรั่วไหล ฉันกำลังมองหาความเป็นไปได้ที่จะใช้ AlertDialog จากบริบทคงที่ แต่ตอนนี้ฉันแน่ใจว่ามันเป็นไปไม่ได้ ผลที่ได้คือขยะเท่านั้นที่ฉันคิด
เหลือเชื่อ

2
ดูเหมือนว่ามันจะใช้งานได้ กล่องโต้ตอบยังคงเปิดอยู่ แต่ไม่มีการเชื่อมต่อกับกิจกรรมหรือส่วนที่สร้างขึ้นใหม่ (จะถูกสร้างขึ้นใหม่ในการเปลี่ยนแปลงการวางแนวแต่ละครั้ง) คุณจึงไม่สามารถทำอะไรที่ต้องใช้Contextปุ่มโต้ตอบOnClickListenerภายใน
Udo Klimaschewski

2
รหัสนี้ใช้ได้ แต่ไม่แนะนำเลย มันรั่วการอ้างอิงกิจกรรมซึ่งเป็นสาเหตุที่ทำให้กล่องโต้ตอบคงอยู่ได้ นี่เป็นการปฏิบัติที่แย่มากซึ่งจะนำไปสู่การรั่วไหลของหน่วยความจำ
Hexise

4

หากคุณกำลังเปลี่ยนเค้าโครงเกี่ยวกับการเปลี่ยนแปลงการวางแนวฉันจะไม่ใส่android:configChanges="orientation"ในรายการของคุณเนื่องจากคุณกำลังสร้างมุมมองใหม่

บันทึกสถานะปัจจุบันของกิจกรรมของคุณ (เช่นข้อความที่ป้อนกล่องโต้ตอบที่แสดงข้อมูลที่แสดง ฯลฯ ) โดยใช้วิธีการเหล่านี้:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}

ด้วยวิธีนี้กิจกรรมจะผ่าน onCreate อีกครั้งและหลังจากนั้นเรียกเมธอด onRestoreInstanceState ซึ่งคุณสามารถตั้งค่า EditText ของคุณได้อีกครั้ง

หากคุณต้องการเก็บวัตถุที่ซับซ้อนมากขึ้นคุณสามารถใช้ได้

@Override
public Object onRetainNonConfigurationInstance() {
}

ที่นี่คุณสามารถจัดเก็บวัตถุใด ๆ และใน onCreate คุณเพียงแค่โทรgetLastNonConfigurationInstance();เพื่อรับวัตถุ


4
OnRetainNonConfigurationInstance()ตอนนี้เลิกใช้แล้วตามที่ Doc บอกว่า: developer.android.com/reference/android/app/… setRetainInstance(boolean retain)ควรใช้แทน: developer.android.com/reference/android/app/…
ForceMagic

@ForceMagic setRetainInstanceแตกต่างอย่างสิ้นเชิง: สำหรับ Fragments และไม่รับประกันว่าคุณจะเก็บอินสแตนซ์นั้นไว้
Miha_x64

4

เพียงเพิ่ม android: configChanges = "orientation" ด้วยองค์ประกอบกิจกรรมของคุณใน AndroidManifest.xml

ตัวอย่าง:

<activity
            android:name=".YourActivity"
            android:configChanges="orientation"
            android:label="@string/app_name"></activity>

ซึ่งอาจทำให้กล่องโต้ตอบแสดงไม่ถูกต้องในบางสถานการณ์
แซม

2
android: configChanges = "orientation | screenSize" หมายเหตุ: หากแอปพลิเคชันของคุณกำหนดเป้าหมายเป็น Android 3.2 (API ระดับ 13) ขึ้นไปคุณควรประกาศการกำหนดค่า "screenSize" ด้วยเนื่องจากจะมีการเปลี่ยนแปลงเมื่ออุปกรณ์สลับระหว่างแนวตั้งและแนวนอน
tsig

1

วิธีการที่ง่ายมากคือการสร้างกล่องโต้ตอบจากวิธีการonCreateDialog()(ดูหมายเหตุด้านล่าง) showDialog()คุณแสดงให้พวกเขาผ่าน ด้วยวิธีนี้ Android จะจัดการการหมุนให้คุณและคุณไม่จำเป็นต้องโทรdismiss()เข้าonPause()เพื่อหลีกเลี่ยง WindowLeak จากนั้นคุณก็ไม่ต้องกู้คืนกล่องโต้ตอบ จากเอกสาร:

แสดงกล่องโต้ตอบที่จัดการโดยกิจกรรมนี้ การเรียกใช้ onCreateDialog (int, Bundle) จะถูกสร้างขึ้นด้วย id เดียวกันในครั้งแรกที่มีการเรียกใช้ id ที่กำหนด จากนั้นกล่องโต้ตอบจะถูกบันทึกและเรียกคืนโดยอัตโนมัติ

ดูเอกสาร Android showDialog ()สำหรับข้อมูลเพิ่มเติม หวังว่ามันจะช่วยใครสักคน!

หมายเหตุ:หากใช้ AlertDialog.Builder ไม่ต้องโทรshow()จากonCreateDialog()โทรcreate()แทน หากใช้ ProgressDialog เพียงแค่สร้างวัตถุตั้งค่าพารามิเตอร์ที่คุณต้องการและส่งคืน สรุปได้ว่าshow()ภายในonCreateDialog()ทำให้เกิดปัญหาเพียงแค่สร้างอินสแตนซ์ de Dialog แล้วส่งคืน ควรใช้งานได้! (ฉันเคยประสบปัญหาในการใช้ showDialog () จาก onCreate () - ไม่แสดงกล่องโต้ตอบจริง - แต่ถ้าคุณใช้ใน onResume () หรือในการเรียกกลับของผู้ฟังจะทำงานได้ดี)


คุณต้องการรหัสสำหรับกรณีใด onCreateDialog () หรือแสดงด้วยตัวสร้างและการเรียกใช้ show () กับมัน?
Caumons

ฉันจัดการไปแล้ว .. แต่สิ่งนี้ก็คือ onCreateDialog () เลิกใช้งานแล้ว: - \
neteinstein

ตกลง! โปรดทราบว่าอุปกรณ์ Android ส่วนใหญ่ยังใช้งานได้กับเวอร์ชัน 2.X ดังนั้นคุณจึงสามารถใช้งานได้ต่อไป! ดูการใช้งานเวอร์ชันแพลตฟอร์ม Android
Caumons

ถึงกระนั้นตัวเลือกอื่น ๆ ถ้าไม่ใช่ onCreateDialog คืออะไร?
neteinstein

1
AlertDialog.Builderคุณสามารถใช้การเรียนการสร้างเช่น หากคุณใช้ภายในonCreateDialog()แทนที่จะใช้show()ผลลัพธ์ของcreate(). มิฉะนั้นให้เรียกshow()และจัดเก็บ AlertDialog ที่ส่งคืนไว้ในแอตทริบิวต์ของกิจกรรมและonPause() dismiss()หากแสดงเพื่อหลีกเลี่ยง WindowLeak หวังว่าจะช่วยได้!
Caumons

1

คำถามนี้ได้รับคำตอบเมื่อนานมาแล้ว

นี่เป็นวิธีแก้ปัญหาที่ไม่แฮ็กและเรียบง่ายที่ฉันใช้สำหรับตัวเอง

ฉันทำคลาสผู้ช่วยนี้เพื่อตัวเองดังนั้นคุณสามารถใช้ในแอปพลิเคชันของคุณได้เช่นกัน

การใช้งานคือ:

PersistentDialogFragment.newInstance(
        getBaseContext(),
        RC_REQUEST_CODE,
        R.string.message_text,
        R.string.positive_btn_text,
        R.string.negative_btn_text)
        .show(getSupportFragmentManager(), PersistentDialogFragment.TAG);

หรือ

 PersistentDialogFragment.newInstance(
        getBaseContext(),
        RC_EXPLAIN_LOCATION,
        "Dialog title", 
        "Dialog Message", 
        "Positive Button", 
        "Negative Button", 
        false)
    .show(getSupportFragmentManager(), PersistentDialogFragment.TAG);





public class ExampleActivity extends Activity implements PersistentDialogListener{

        @Override
        void onDialogPositiveClicked(int requestCode) {
                switch(requestCode) {
                  case RC_REQUEST_CODE:
                  break;
                }
        }

        @Override
        void onDialogNegativeClicked(int requestCode) {
                switch(requestCode) {
                  case RC_REQUEST_CODE:
                  break;
                }          
        }
}

1

คุณสามารถรวมเมธอด onSave / onRestore ของ Dialog เข้ากับเมธอด onSave / onRestoreของกิจกรรมเพื่อรักษาสถานะของกล่องโต้ตอบ

หมายเหตุ:วิธีนี้ใช้ได้กับกล่องโต้ตอบ "ธรรมดา" เหล่านั้นเช่นการแสดงข้อความแจ้งเตือน จะไม่สร้างซ้ำเนื้อหาของ WebView ที่ฝังอยู่ในกล่องโต้ตอบ หากคุณต้องการป้องกันไม่ให้กล่องโต้ตอบที่ซับซ้อนปิดลงในระหว่างการหมุนเวียนลองใช้วิธีของ Chung IW

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
     super.onRestoreInstanceState(savedInstanceState);
     myDialog.onRestoreInstanceState(savedInstanceState.getBundle("DIALOG"));
     // Put your codes to retrieve the EditText contents and 
     // assign them to the EditText here.
}

@Override
protected void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
     // Put your codes to save the EditText contents and put them 
     // to the outState Bundle here.
     outState.putBundle("DIALOG", myDialog.onSaveInstanceState());
}

1

แน่นอนว่าแนวทางที่ดีที่สุดคือการใช้ DialogFragment

นี่คือคำตอบของฉันของคลาส Wrapper ที่ช่วยป้องกันไม่ให้กล่องโต้ตอบต่างๆถูกปิดภายในหนึ่ง Fragment (หรือกิจกรรมที่มีการปรับโครงสร้างเล็กน้อย) นอกจากนี้ยังช่วยหลีกเลี่ยงการปรับโครงสร้างโค้ดจำนวนมากหากด้วยเหตุผลบางประการมีจำนวนมากAlertDialogsกระจัดกระจายอยู่ในรหัสโดยมีความแตกต่างเล็กน้อยระหว่างรหัสเหล่านี้ในแง่ของการกระทำลักษณะหรืออย่างอื่น

public class DialogWrapper extends DialogFragment {
    private static final String ARG_DIALOG_ID = "ARG_DIALOG_ID";

    private int mDialogId;

    /**
     * Display dialog fragment.
     * @param invoker  The fragment which will serve as {@link AlertDialog} alert dialog provider
     * @param dialogId The ID of dialog that should be shown
     */
    public static <T extends Fragment & DialogProvider> void show(T invoker, int dialogId) {
        Bundle args = new Bundle();
        args.putInt(ARG_DIALOG_ID, dialogId);
        DialogWrapper dialogWrapper = new DialogWrapper();
        dialogWrapper.setArguments(args);
        dialogWrapper.setTargetFragment(invoker, 0);
        dialogWrapper.show(invoker.getActivity().getSupportFragmentManager(), null);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDialogId = getArguments().getInt(ARG_DIALOG_ID);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return getDialogProvider().getDialog(mDialogId);
    }

    private DialogProvider getDialogProvider() {
        return (DialogProvider) getTargetFragment();
    }

    public interface DialogProvider {
        Dialog getDialog(int dialogId);
    }
}

เมื่อมันมาถึงกิจกรรมที่คุณสามารถเรียกใช้getContext()ภายในonCreateDialog()โยนมันไปที่อินเตอร์เฟซและขอโต้ตอบที่เฉพาะเจาะจงโดยDialogProvider mDialogIdควรลบตรรกะทั้งหมดในการจัดการกับชิ้นส่วนเป้าหมาย

การใช้งานจากส่วนย่อย:

public class MainFragment extends Fragment implements DialogWrapper.DialogProvider {
    private static final int ID_CONFIRMATION_DIALOG = 0;

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        Button btnHello = (Button) view.findViewById(R.id.btnConfirm);
        btnHello.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogWrapper.show(MainFragment.this, ID_CONFIRMATION_DIALOG);
            }
        });
    }

    @Override
    public Dialog getDialog(int dialogId) {
        switch (dialogId) {
            case ID_CONFIRMATION_DIALOG:
                return createConfirmationDialog(); //Your AlertDialog
            default:
                throw new IllegalArgumentException("Unknown dialog id: " + dialogId);
        }
    }
}

คุณสามารถอ่านบทความทั้งหมดได้ในบล็อกของฉันจะป้องกันไม่ให้กล่องโต้ตอบถูกปิดได้อย่างไร? และเล่นกับรหัสที่มา


1

ดูเหมือนว่าจะยังคงเป็นปัญหาอยู่แม้ว่าจะ "ทำทุกอย่างถูกต้อง" และใช้DialogFragmentฯลฯ

มีชุดข้อความในเครื่องมือติดตามปัญหาของ Googleซึ่งอ้างว่ามีสาเหตุมาจากข้อความเลิกใช้เก่าถูกทิ้งไว้ในคิวข้อความ วิธีแก้ปัญหาที่ให้มานั้นค่อนข้างง่าย:

    @Override
    public void onDestroyView() {
        /* Bugfix: https://issuetracker.google.com/issues/36929400 */
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);

        super.onDestroyView();
    }

เหลือเชื่อว่าสิ่งนี้ยังคงต้องใช้เวลา 7 ปีหลังจากที่มีการรายงานปัญหาครั้งแรก


ดูยังstackoverflow.com/questions/14657490/...
CoolMind

0

ฉันมีปัญหาที่คล้ายกัน: เมื่อการวางแนวหน้าจอเปลี่ยนไปonDismissผู้ฟังของกล่องโต้ตอบจะถูกเรียกแม้ว่าผู้ใช้จะไม่ได้ปิดกล่องโต้ตอบก็ตาม ฉันสามารถแก้ไขปัญหานี้ได้โดยใช้onCancelฟังก์ชั่นแทนซึ่งจะเรียกใช้ทั้งเมื่อผู้ใช้กดปุ่มย้อนกลับและเมื่อผู้ใช้สัมผัสภายนอกกล่องโต้ตอบ


0

ในกรณีที่ไม่มีอะไรช่วยได้และคุณต้องการโซลูชันที่ใช้งานได้คุณสามารถไปด้านที่ปลอดภัยและทุกครั้งที่คุณเปิดกล่องโต้ตอบบันทึกข้อมูลพื้นฐานลงใน ViewModel ของกิจกรรม (และลบออกจากรายการนี้เมื่อคุณปิดกล่องโต้ตอบ) ข้อมูลพื้นฐานนี้อาจเป็นประเภทของกล่องโต้ตอบและรหัสบางส่วน (ข้อมูลที่คุณต้องการเพื่อเปิดกล่องโต้ตอบนี้) ViewModel นี้จะไม่ถูกทำลายระหว่างการเปลี่ยนแปลงของวงจรชีวิตของกิจกรรม สมมติว่าผู้ใช้เปิดกล่องโต้ตอบเพื่ออ้างอิงถึงร้านอาหาร ประเภทไดอะล็อกจะเป็น LeaveReferenceDialog และ id จะเป็น id ร้านอาหาร เมื่อเปิดกล่องโต้ตอบนี้คุณจะบันทึกข้อมูลนี้ใน Object ที่คุณสามารถเรียก DialogInfo และเพิ่มวัตถุนี้ใน ViewModel ของกิจกรรม ข้อมูลนี้จะช่วยให้คุณสามารถเปิดกล่องโต้ตอบอีกครั้งเมื่อมีการเรียกกิจกรรม onResume ():

// On resume in Activity
    override fun onResume() {
            super.onResume()
    
            // Restore dialogs that were open before activity went to background
            restoreDialogs()
        }

ซึ่งเรียก:

    fun restoreDialogs() {
    mainActivityViewModel.setIsRestoringDialogs(true) // lock list in view model

    for (dialogInfo in mainActivityViewModel.openDialogs)
        openDialog(dialogInfo)

    mainActivityViewModel.setIsRestoringDialogs(false) // open lock
}

เมื่อ IsRestoringDialogs ใน ViewModel ถูกตั้งค่าเป็น true ข้อมูลไดอะล็อกจะไม่ถูกเพิ่มลงในรายการในโมเดลมุมมองและสิ่งสำคัญเพราะตอนนี้เรากำลังกู้คืนไดอะล็อกที่อยู่ในรายการนั้นแล้ว มิฉะนั้นการเปลี่ยนแปลงรายการขณะใช้งานจะทำให้เกิดข้อยกเว้น ดังนั้น:

// Create new dialog
        override fun openLeaveReferenceDialog(restaurantId: String) {
            var dialog = LeaveReferenceDialog()
            // Add id to dialog in bundle
            val bundle = Bundle()
            bundle.putString(Constants.RESTAURANT_ID, restaurantId)
            dialog.arguments = bundle
            dialog.show(supportFragmentManager, "")
        
            // Add dialog info to list of open dialogs
            addOpenDialogInfo(DialogInfo(LEAVE_REFERENCE_DIALOG, restaurantId))
    }

จากนั้นลบข้อมูลการโต้ตอบเมื่อปิด:

// Dismiss dialog
override fun dismissLeaveReferenceDialog(Dialog dialog, id: String) {
   if (dialog?.isAdded()){
      dialog.dismiss()
      mainActivityViewModel.removeOpenDialog(LEAVE_REFERENCE_DIALOG, id)
   }
}

และใน ViewModel ของกิจกรรม:

fun addOpenDialogInfo(dialogInfo: DialogInfo){
    if (!isRestoringDialogs){
       val dialogWasInList = removeOpenDialog(dialogInfo.type, dialogInfo.id)
       openDialogs.add(dialogInfo)
     }
}


fun removeOpenDialog(type: Int, id: String) {
    if (!isRestoringDialogs)
       for (dialogInfo in openDialogs) 
         if (dialogInfo.type == type && dialogInfo.id == id) 
            openDialogs.remove(dialogInfo)
}

คุณเปิดกล่องโต้ตอบทั้งหมดที่เปิดไว้ก่อนหน้านี้อีกครั้งตามลำดับเดิม แต่พวกเขาเก็บรักษาข้อมูลไว้อย่างไร? ไดอะล็อกแต่ละอันมี ViewModel ของตัวเองซึ่งจะไม่ถูกทำลายในระหว่างวงจรชีวิตของกิจกรรม ดังนั้นเมื่อคุณเปิดกล่องโต้ตอบคุณจะได้รับ ViewModel และเริ่มต้น UI โดยใช้ ViewModel ของกล่องโต้ตอบเช่นเคย


-3

เพียงแค่ใช้

ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize

และแอพจะรู้วิธีจัดการการหมุนและขนาดหน้าจอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.