我尝试使用自定义对话框片段来获取用户的一些输入,并且我遇到了这个问题。即使我在对话框类中使用getDialog.dismiss()
或this.dismiss()
,或者在我使用fragmentTransaction.remove(fragment)
检索后使用getFragmentByTag
尝试将其删除,对话框也不会消失。实际上,我注意到在解雇后无法再访问该对话框,但仍然没有消失。
当我第一次单击OK以关闭时,OnClickListener
在片段类中被调用并且getDialog().dismiss();
被执行但我仍然可以看到对话框。当我第二次点击它时,我得到一个错误,说我试图访问空引用,所以我理解对象被破坏但片段仍然可见。
这是错误
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Dialog.dismiss()' on a null object reference
at tg.androidgeek.ezna.Produits.AddProduitDialog$1.onClick(AddProduitDialog.java:75)
at android.view.View.performClick(View.java:4764)
at android.view.View$PerformClick.run(View.java:19844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
这是片段类:
public class AddProduitDialog extends DialogFragment implements TextView.OnEditorActionListener/*, View.OnClickListener */{
private static final String TAG = "AddProduitDialog";
Button BtOkProduit;
Button BtKoProduit;
Spinner spinner;
ArrayList<Categorie> Categories;
private EditText mEditText;
private EditText mEditTextPrix;
public AddProduitDialog() {
// Empty constructor required for DialogFragment
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_produit, container);
//Getting All Categories from DataBase
CategorieManager cm = new CategorieManager(getContext());
cm.open();
Categories = cm.getAllCategorieObjects();
cm.close();
spinner = (Spinner) view.findViewById(R.id.spinner_add_categorie);
SpinAdapter spinAdapter = new SpinAdapter(getContext(), R.layout.item_row_spinner, Categories);
spinner.setAdapter(spinAdapter);
mEditText = (EditText) view.findViewById(R.id.editText);
mEditTextPrix = (EditText) view.findViewById(R.id.edit_text_prix);
getDialog().setTitle("Ajoutez Un Produit");
// Show soft keyboard automatically
mEditText.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditText.setOnEditorActionListener(this);
BtOkProduit = (Button) (view.findViewById(R.id.btnOkProduit));
BtKoProduit = (Button) (view.findViewById(R.id.btnKoProduit));
BtKoProduit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick btnKo");
getDialog().dismiss();
// if (AddProduitDialog.this!=null)AddProduitDialog.this.dismiss();
//Any other way I've tried fails
}
});
/* BtOkProduit.setOnClickListener(this);*/
getDialog().cancel();
return view;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (EditorInfo.IME_ACTION_DONE == actionId) {
// Return input text to activity
EditProduitDialogListener activity = (EditProduitDialogListener) getActivity();
Produit produit = new Produit(0,
mEditText.getText().toString(),
Categories.get(spinner.getSelectedItemPosition()).getId()
, Double.parseDouble(mEditTextPrix.getText().toString())
, R.mipmap.ic_folder);
activity.onFinishEditProduit(produit);
this.dismiss();
return true;
}
return false;
}
public interface EditProduitDialogListener {
void onFinishEditProduit(Produit Value);
}
public class SpinAdapter extends ArrayAdapter<Categorie> {
ArrayList<Categorie> Values;
Context context;
public SpinAdapter(Context context, int RessoucreId, ArrayList<Categorie> Values) {
super(context, RessoucreId, Values);
this.Values = Values;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// if (convertView == null) {
TextView tv = (TextView) getLayoutInflater(null).inflate(R.layout.item_row_spinner, null);
tv.setText(Values.get(position).getNom());
return tv;
// }
/* TextView tv = (TextView) (convertView);
tv.setText(Values.get(position).getNom());
return tv;*/
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
TextView tv = (TextView) getLayoutInflater(null).inflate(R.layout.item_row_spinner, null);
tv.setText(Values.get(position).getNom());
return tv;
}
TextView tv = (TextView) (convertView);
tv.setText(Values.get(position).getNom());
return tv;
}
}
}
这是对话框的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/nom_du_produit"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:inputType="textShortMessage"
android:lines="1"
android:minWidth="100dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/categorie"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/spinner_add_categorie"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/prix"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/edit_text_prix"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberDecimal"
android:lines="1"
android:linksClickable="false" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btnOkProduit"
style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/ok" />
<Button
android:id="@+id/btnKoProduit"
style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/cancel" />
</LinearLayout>
</LinearLayout>
我真的希望有人可以帮忙解决这个问题,谢谢。