Невозможно сохранить состояние пользовательской диалоговой кнопки при изменении ориентации экрана

У меня есть настроенный диалог, который я создал с помощью DialogFragment. он использует вид, который получил одну кнопку и текст редактирования. в моем тексте редактирования я реализовал средство просмотра текста, в котором, если в тексте редактирования есть значения, кнопка становится видимой, иначе она остается невидимой.

public  class ShowDialog extends DialogFragment {

private Button btnShowBalance;
private EditText balanceInquiryPinInput;

public ShowDialog(){

}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View myView = inflater.inflate(R.layout.fragment_balance_inquiry,null);

    btnShowBalance= (Button) myView.findViewById(R.id.btnShowBalance);

    balanceInquiryPinInput = (EditText) myView.findViewById(R.id.et_balance_inquiry_pin);

    balanceInquiryPinInput.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if(s.length() > 0){
                btnShowBalance.setVisibility(View.VISIBLE);
            }else{
                btnShowBalance.setVisibility(View.INVISIBLE);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

     btnShowBalance.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showBalance(balanceInquiryPinInput,nameview,ShowDialog.this);
        }
    });


    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setView(myView);

    // Create the AlertDialog object and return it
    return builder.create();
}

}

проблема

Когда я изменяю свою ориентацию экрана на (скажем, альбомную), если я набрал что-нибудь в свой текст редактирования до изменения своей ориентации, все, что я напечатал, все еще видно в альбомной ориентации, моя кнопка видна, но она становится не щелкаемой. я не могу щелкнуть по нему Я должен удалить диалог, нажав где-нибудь за пределами диалогового окна или кнопку назад и создать его снова.

Как сделать так, чтобы моя кнопка оставалась интерактивной, даже если изменить ориентацию экрана?

Примечание: кликабельно перед сменой ориентации.

РЕДАКТИРОВАТЬ

Мой диалог активируется кнопкой, которая находится во фрагменте, а не в активности. этот вопрос не является дубликатом этого вопроса, поскольку последний является важным фактором в деятельности, и его реализация ненадежна, на мой взгляд, и его состояние (кнопка)

РЕДАКТИРОВАТЬ XML для моего пользовательского макета диалога

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#044848"
>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:background="@drawable/check_balance"
    >

    <EditText
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:id="@+id/et_balance_inquiry_pin"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:background="@drawable/enter_pin_textview"
        android:inputType="numberPassword"/>

    <Button
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:text="OK"
        android:id="@+id/btnShowBalance"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="10dp"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:background="@drawable/show_balance_ok_button"
        android:visibility="invisible" />

</LinearLayout>

2 ответа

Решение

Проблема с отключенной кнопкой может быть из-за того, что диалог больше не функционирует из-за того, что вызывающий вид разрушается при изменении ориентации. Таким образом, он все еще может быть видимым, но на самом деле является артефактом предыдущего представления, прежде чем он был уничтожен.

Вам нужно использовать методы, которые сохраняют состояние вашего экземпляра фрагмента диалога при его создании. например, вы можете позвонить

setRetainInstanceState(true);

в вашем onCreateDialog метод для сохранения состояния вашего экземпляра DialogFragment при изменении ориентации экрана.

Возможно, вам придется перевесить onDestroyView() чтобы предотвратить уничтожение диалога при изменении ориентации экрана. как это

@Override
public void onDestroyView() {
    if (getDialog() != null && getRetainInstance())
        getDialog().setDismissMessage(null);
    super.onDestroyView();
}

Информация об этом и других методах фрагмента может быть найдена здесь.

Если вы добавляете прослушиватели кликов в диалоге к своим кнопкам, вам нужно добавить onclick для ваших новых объектов кнопок, созданных после onConfigurationChanged.

установка прослушивателя кликов в xml - хорошая практика для устранения проблемы, подобной этой:

поэтому установите в клике в XML, как это:

<Button
android:id="@+id/addnote"
android:onClick="closeDialog"
/>

сейчас в деятельности звоните на клик где хотите

public void closeDialog(View view) {
dialogObject.dismiss();
} 

после использования по клику в xml не нужно вызывать setOnClickListener

Другие вопросы по тегам