![](/img/trans.png)
[英]Android gridview maintain the state when changes orientation but need to update views
[英]Unable to maintain the state of a custom dialog button when screen orientation changes
我有一個使用DialogFragment創建的自定義對話框。 它使用一個視圖,它有一個按鈕和一個edittext。 在我的edittext中,我實現了一個textwatcher,如果edittext中有值,則按鈕變為可見,否則它將保持不可見。
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();
}
}
問題
當我將我的屏幕方向改為(比如說)風景時,如果我在更改我的方向之前輸入了任何內容,那么無論我輸入的是什么,在風景中仍然可見,我的按鈕是可見的但它變得無法點擊。 我無法點擊它。 我必須通過按對話框窗口或后退按鈕之外的某處刪除對話框並再次創建它。
即使更改屏幕方向,如何使我的按鈕保持可點擊狀態?
注意:在更改方向之前可以單擊它。
編輯
我的對話框由一個片段激活,該片段處於片段而非活動狀態。 這個問題不是一個重復的這一個 ,因為后者是一個活動的implentation和它的實現是不可靠的,以我的觀點,它是有問題的狀態(按鈕)
編輯我的自定義對話框布局的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>
按鈕被禁用的問題可能是由於對話視圖在方向改變時被破壞而不再起作用。 因此它可能仍然是可見的,但在它被銷毀之前它實際上是前一個視圖的工件。
您需要使用在創建對話框片段實例時保存對話框片段實例狀態的方法。 例如你可以打電話
setRetainInstanceState(true);
在onCreateDialog
方法中,在屏幕方向更改時保留DialogFragment實例的狀態。
您可能需要覆蓋onDestroyView()
以防止在屏幕方向更改時銷毀對話框。 像這樣
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
}
可以在此處找到有關此方法和其他片段方法的信息。
如果要將Dialog中的單擊偵聽器添加到按鈕,則需要在onConfigurationChanged之后為新按鈕對象添加onclick。
在xml中單擊偵聽器設置是刪除這樣的問題的好習慣:
所以設置點擊xml如下:
<Button
android:id="@+id/addnote"
android:onClick="closeDialog"
/>
現在在活動中調用onclick你想要的地方
public void closeDialog(View view) {
dialogObject.dismiss();
}
在xml上單擊使用后無需調用setOnClickListener
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.