当屏幕方向改变时,无法维持自定义对话框按钮的状态

3

我有一个定制的对话框,是使用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>


@MrsEd,您如何恢复按钮的savedinstancestate?我的意思是,我觉得难以在您评论中链接的答案中实现它。 - Edijae Crusar
@MrsEd 我还没有找到答案,兄弟。你链接中的那个太复杂了,让我感到困惑。我在这里找不到与我的按钮相关的好方法。 - Edijae Crusar
@MrsEd 我已经发布了我的自定义对话框的 XML,其中包含按钮。是的,即使屏幕方向改变,我也可以从用户输入中获取文本。只是按钮变得无法点击。 - Edijae Crusar
2个回答

1
setRetainInstanceState(true);

在您的onCreateDialog方法中保留您的DialogFragment实例的状态以便在屏幕方向发生改变时使用。您可能需要重写onDestroyView()方法以防止对话框在屏幕方向发生改变时被销毁,像这样:
@Override
public void onDestroyView() {
    if (getDialog() != null && getRetainInstance())
        getDialog().setDismissMessage(null);
    super.onDestroyView();
}

关于这种以及其他片段方法的信息可以在这里找到。


0

如果您正在为对话框中的按钮添加单击监听器,则需要在onConfigurationChanged之后创建新的按钮对象并添加onclick。

在xml中设置点击侦听器是解决此类问题的良好实践:

因此,请像这样在xml中设置点击:

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

现在在活动中调用onclick,您想在哪里就在哪里调用

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

在 XML 中使用 on click 后,无需调用 setOnClickListener。


如果我的方法有一些参数怎么办?顺便说一下,这个对话框是在一个片段中实现的。我在XML中收到一个警告:“无法解析符号xxx,请检查onclick XML属性中指定的方法是否在相关活动中声明。” - Edijae Crusar
我遇到了一个错误!在活动中找不到showBal方法,这个方法在片段中而不是活动中。有没有办法在xml的onClick属性中使用它? - Edijae Crusar
抱歉,但我无法理解你的意思,请再清楚一些。 - santoXme
我认为你的答案对我的情况不适用,因为在Fragment类中无法使用android:onClick为Dialog布局中的Button注册onClick回调。这是因为Android只会在Activity中查找与该名称(showBal)匹配的方法,并且如果找不到该方法,它将抛出异常。 - Edijae Crusar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接