[英]Why dosen't the alert dialog show?
我有一個自定義對話框,它應該從用戶那里獲得一個值,但是它沒有顯示。 任何人都可以幫忙嗎?
這是我的代碼。
自定義對話框代碼
package com.aadi.pointer.Dialogs;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import com.aadi.pointer.R;
import com.google.android.material.switchmaterial.SwitchMaterial;
import java.util.Objects;
public class EnterParentPinDialog extends AppCompatDialogFragment
{
public interface PosBtnCallback {
void setListener(DialogInterface dialog, int which, Context mContext,EditText et_parent_pin, boolean doNotAskMeAgain);
}
public interface NegBtnCallback {
void setListener(DialogInterface dialog, int which);
}
private PosBtnCallback posBtnCallback;
private NegBtnCallback negBtnCallback;
private Context mContext;
private String title = null;
public EnterParentPinDialog( PosBtnCallback posBtnCallback, NegBtnCallback negBtnCallback, Context mContext) {
this.posBtnCallback = posBtnCallback;
this.negBtnCallback = negBtnCallback;
this.mContext = mContext;
}
public EnterParentPinDialog( PosBtnCallback posBtnCallback, NegBtnCallback negBtnCallback, Context mContext,String title) {
this.posBtnCallback = posBtnCallback;
this.negBtnCallback = negBtnCallback;
this.mContext = mContext;
this.title = title;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getActivity()));
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.layout_dialog, null);
EditText et_parent_pin = view.findViewById(R.id.et_parent_pin);
SwitchMaterial switch_dnama = view.findViewById(R.id.switch_dnama);
TextView dnama = view.findViewById(R.id.dnama);
if(title == null) {
switch_dnama.setVisibility(View.VISIBLE);
dnama.setVisibility(View.VISIBLE);
/*switch_dnama.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(isChecked) builder.setView(view)
.setTitle("Enter Your Parent Pin")
.setNegativeButton("cancel", (dialog, which) ->negBtnCallback.setListener(dialog,which))
.setPositiveButton("Accept", (dialogInterface, i) -> posBtnCallback.setListener(dialogInterface,i,mContext,et_parent_pin,true));
else builder.setView(view)
.setTitle("Enter Your Parent Pin")
.setNegativeButton("cancel", (dialog, which) ->negBtnCallback.setListener(dialog,which))
.setPositiveButton("Accept", (dialogInterface, i) -> posBtnCallback.setListener(dialogInterface,i,mContext,et_parent_pin,false));
});*/
} else if(title != null){
switch_dnama.setVisibility(View.INVISIBLE);
dnama.setVisibility(View.INVISIBLE);
builder.setView(view)
.setTitle(title)
.setNegativeButton("cancel", (dialog, which) ->negBtnCallback.setListener(dialog,which))
.setPositiveButton("Accept", (dialogInterface, i) -> posBtnCallback.setListener(dialogInterface,i,mContext,et_parent_pin, false));
}
return builder.create();
}
}
調用自定義對話框的活動
package com.aadi.pointer.Kids;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.PopupMenu;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.aadi.pointer.Dialogs.EnterParentPinDialog;
import com.aadi.pointer.Dialogs.EnterReasonandValueDialogClass;
import com.aadi.pointer.ListAdapters.ActionListAdapter;
import com.aadi.pointer.Nav.HomeActivity;
import com.aadi.pointer.R;
import com.aadi.pointer.Storage.CloudFirestoreControl;
import com.aadi.pointer.Storage.MyApplication;
import com.aadi.pointer.Storage.StorageStructure.Action;
import com.aadi.pointer.Storage.StorageStructure.ActionList;
import com.aadi.pointer.Storage.StorageStructure.Learner;
import com.aadi.pointer.Storage.StorageStructure.Parent;
import com.aadi.pointer.Utils;
import com.google.firebase.firestore.FirebaseFirestore;
import java.util.ArrayList;
import java.util.List;
@SuppressLint("ALL")
public class KidHomeActivity extends AppCompatActivity implements ActionListAdapter.OnRecyclerListItemClick, View.OnClickListener, PopupMenu.OnMenuItemClickListener {
private static final String TAG = "KidHomeActivity";
List<Integer> selectedActionPositions;
FirebaseFirestore db;
TextView tv_KidName,tv_name,tv_kidpoints;
ImageView btn_back,iv_kid_avatar,iv_kid_rank,btn_add;
RelativeLayout btn_more_options;
RecyclerView rv_actions;
CloudFirestoreControl control;
MyApplication myApplication;
Learner clickedLearner;
Parent currentParent;
ActionList actionList;
int pointsint, beginningPoints;
ActionListAdapter actionListAdapter;
Context context;
Intent i;
boolean editable;
String phoneNo;
@SuppressLint("ALL")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_kid_home);
setUp();
setUpRVActionList();
}
private void setUp(){
TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phoneNo = manager.getLine1Number();
db = FirebaseFirestore.getInstance();
tv_KidName = findViewById(R.id.tv_KidName);
tv_name = findViewById(R.id.tv_name);
tv_kidpoints = findViewById(R.id.tv_kidpoints);
btn_back = findViewById(R.id.btn_back);
iv_kid_avatar = findViewById(R.id.iv_kid_avatar);
iv_kid_rank = findViewById(R.id.iv_kid_rank);
btn_add = findViewById(R.id.btn_add);
rv_actions = findViewById(R.id.rv_actions);
btn_more_options = findViewById(R.id.btn_more_options);
selectedActionPositions = new ArrayList<>();
btn_more_options.setOnClickListener(v -> {
PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.menu_kid_home_more_options);
popup.show();
});
context = this;
i = new Intent(this,EditKidDataActivity.class);
control = new CloudFirestoreControl();
myApplication = (MyApplication) getApplicationContext();
clickedLearner = myApplication.getClickedLearner();
btn_add.setOnClickListener(v -> new EnterReasonandValueDialogClass((dialog, which, mContext, et_reason, et_value) -> {
control.setAction(phoneNo,clickedLearner.getScreen_Name(),et_reason.getText().toString(),Integer.parseInt(et_value.getText().toString()));
actionList.getActionList().add(new Action(et_reason.getText().toString(),Integer.parseInt(et_value.getText().toString())));
actionListAdapter.notifyDataSetChanged();
},(dialog, which) -> dialog.dismiss(),v.getContext()).show(getSupportFragmentManager(),"Enter Reason and value"));
myApplication.setSignedInPhoneNo("+919945922138");
//myApplication.setSignedInPhoneNo(Utils.getPhoneNoWithTelephonyManager(this,this));
control.getParentData(phoneNo,(fullname, screenname, age, phoneNo1, pin, askParentPin) -> {
currentParent = new Parent(fullname, screenname,phoneNo,age,null,null,pin,askParentPin);
if(currentParent.getPin() == 0){
new AlertDialog.Builder(this)
.setTitle("Oops, you do not have a parent pin")
.setMessage("Oops, we think you forgot to set your parent pin" +
"press ok to enter your parent pin")
.setPositiveButton("Ok",(dialog, which) -> {
EnterParentPinDialog pinDialog = new EnterParentPinDialog((dialog1, which1, mContext, et_parent_pin,dontAskMeAgain) -> currentParent.setPin(Integer.parseInt(et_parent_pin.getText().toString())),(dialog1, which1) -> dialog1.dismiss() ,this,"Enter Your Parent Pin");
pinDialog.show(getSupportFragmentManager(), "Get points");
Utils.delay(2,() ->
new AlertDialog.Builder(this)
.setTitle("Heads Up!")
.setMessage("In case you forgot or want to change your parent pin," +
"you can do that my going to the account page (Click the account" +
" icon in the home screen). There you can press change parent pin and enter a new one")
.setPositiveButton("Ok",(dialogInterface, i) -> dialogInterface.dismiss()).show());
}).show();
}
});
control.getActionList(phoneNo,myApplication.getClickedLearner().getScreen_Name(),actionList1 -> actionList = actionList1);
pointsint = clickedLearner.getHomePoints();
tv_KidName.setText(clickedLearner.getScreen_Name());
tv_name.setText(clickedLearner.getScreen_Name());
tv_kidpoints.setText(Integer.toString(clickedLearner.getHomePoints()));
btn_back.setOnClickListener(this);
beginningPoints = clickedLearner.getHomePoints();
clickedLearner.worthyOfsetiv(iv_kid_rank);
}
private void setUpRVActionList(){
rv_actions.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.HORIZONTAL,false));
control.getActionList(phoneNo,clickedLearner.getScreen_Name(),actionList1 -> {
rv_actions.setAdapter(new ActionListAdapter(actionList1,this));
actionListAdapter = new ActionListAdapter(actionList1,this);
actionList = actionList1;
});
}
@Override
public void onClick(View v) {
for (Action a: actionList.getActionList()) {
control.setAction(phoneNo,clickedLearner.getScreen_Name(),a.getReason(),a.getPoints());
}
if(pointsint - beginningPoints == 0){
control.saveParentData(phoneNo,
currentParent.getFull_Name(),
currentParent.getScreen_Name(),
currentParent.getAge(),
currentParent.getPin());
Utils.toActivity(this, HomeActivity.class);
}
else {
AlertDialog saveCheck = new AlertDialog.Builder(v.getContext())
.setTitle("Change in Points")
.setMessage("Your kids points had changed, do you want to save it?")
.setPositiveButton("Yes", null)
.setNegativeButton("No", null)
.show();
saveCheck.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v1 -> {
clickedLearner.worthyOfsetiv(iv_kid_rank);
myApplication.setClickedLearner(clickedLearner);
control.saveLearnerData(phoneNo,
clickedLearner.getScreen_Name(),
clickedLearner.getFull_Name(),
clickedLearner.getAge(),
clickedLearner.getRank().toString(),
null,
null,
clickedLearner.getParentsID(),
null,
false,
0,
pointsint);
control.saveParentData(phoneNo,
currentParent.getFull_Name(),
currentParent.getScreen_Name(),
currentParent.getAge(),
currentParent.getPin());
Utils.toActivity(this,HomeActivity.class);
});
saveCheck.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v1 -> {
control.saveParentData(phoneNo,
currentParent.getFull_Name(),
currentParent.getScreen_Name(),
currentParent.getAge(),
currentParent.getPin());
clickedLearner.setHomePoints(beginningPoints);
Utils.toActivity(this,HomeActivity.class);
});
}
}
@Override
public void onClick(int position) {
if (editable){
Log.i(TAG, "onClick: editing");
new AlertDialog.Builder(this)
.setTitle("Edit Points")
.setMessage("You are editing your kids actions" +
"if you want to edit an action click edit. " +
"If you want to delete an action, press delete " +
"Click on the action you want to edit or delete")
.setPositiveButton("Edit",
(dialog, which) -> new EnterReasonandValueDialogClass((dialog1, which1, mContext, et_reason, et_value) -> {
control.deleteDocument(db.collection("Parents")
.document(phoneNo)
.collection("Learners")
.document(clickedLearner.getScreen_Name())
.collection("Actions")
.document(actionList.getActionList().get(position).getReason()));
control.setAction(phoneNo,clickedLearner.getScreen_Name(),et_reason.getText().toString(),Integer.parseInt(et_value.getText().toString()));
setUpRVActionList();
editable = false;
},
(dialog1, which1) -> {
dialog1.dismiss();
editable = false;
},this).show(getSupportFragmentManager(), "Get points"))
.setNegativeButton("Delete", (dialog, which) -> {
control.deleteDocument(db.collection("Parents")
.document(phoneNo)
.collection("Learners")
.document(clickedLearner.getScreen_Name())
.collection("Actions")
.document(actionList.getActionList().get(position).getReason()));
setUpRVActionList();
editable = false;
}).show();
actionListAdapter.notifyDataSetChanged();
}
else {
Log.d(TAG, "onClick:" + currentParent.isAskParentPin());
if(currentParent.isAskParentPin()){
addPoints(actionList.getActionList().get(position).getPoints());
} else if(!currentParent.isAskParentPin()) {
new EnterParentPinDialog((dialog, which, mContext, et_parent_pin, doNotAskMeAgain) -> {
control.saveParentData(
currentParent.getPhoneNumber(),
currentParent.getFull_Name(),
currentParent.getScreen_Name(),
currentParent.getAge(),
currentParent.getPin(),
Boolean.toString(doNotAskMeAgain));
currentParent.setAskParentPin(doNotAskMeAgain);
addPoints(actionList.getActionList().get(position).getPoints());
},(dialog, which) -> dialog.cancel(),this).show(getSupportFragmentManager(), null);
}
}
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.edit_kid_item:
Log.i(TAG, "onMenuItemClick: Edit Kid Data");
context.startActivity(new Intent(context, EditKidDataActivity.class));
return true;
case R.id.edit_action_item:
editable = true;
Log.i(TAG, "onMenuItemClick: Edit Action");
new AlertDialog.Builder(this)
.setTitle("Edit kid Actions")
.setMessage("Click on the action you want to edit")
.setPositiveButton("Ok", (dialog, which) -> dialog.dismiss())
.show();
return true;
case R.id.delete_item:
// do your code
Log.i(TAG, "onMenuItemClick: Delete Kid");
new AlertDialog.Builder(this)
.setTitle("Are you sure you want to delete this kid?")
.setMessage("You wont be able to undo this")
.setPositiveButton("Sure",(dialog, which) -> {
control.deleteKid(
db.collection("Parents")
.document(phoneNo)
.collection("Learners")
.document(clickedLearner.getScreen_Name()));
Utils.toActivity(this,HomeActivity.class);
})
.setNegativeButton("No",(dialog, which) -> dialog.dismiss()).show();
return true;
default:
return false;
}
}
private void addPoints(int value){
if(value == 0) Log.d(TAG, "onClick: Didnt Get points");
else {
pointsint += value;
tv_kidpoints.setText(Integer.toString(pointsint));
clickedLearner.setHomePoints(pointsint);
clickedLearner.worthyOfsetiv(iv_kid_rank);
}
}
}
當我嘗試打開對話框時,會出現一個灰色屏幕,但是我沒有得到我的布局。 該對話框將在單擊回收站視圖的項目時打開我收到此錯誤消息:
2021-01-09 10:13:59.581 12265-12308/com.aadi.pointer I/om.aadi.pointe: JIT allocated 74KB for compiled code of void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
2021-01-09 10:14:20.973 12265-12356/com.aadi.pointer W/Firestore: (22.0.1) [WatchStream]: (4d8522f) Stream closed with status: Status{code=CANCELLED, description=Disconnecting idle stream. Timed out waiting for new targets., cause=null}.
2021-01-09 10:16:45.210 12265-12265/com.aadi.pointer W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed. **When i click out to stop the grey screen**
我是 android 的新手,所以我不知道該怎么辦。 我還沒有找到這樣的東西。
提前致謝
“編輯點”對話框的問題是您沒有在顯示之前調用create
。 此外,您應該在正按鈕操作中添加花括號。
您應該將代碼編輯為:
new AlertDialog.Builder(this)
.setTitle("Edit Points")
.setMessage("You are editing your kids actions" +
"if you want to edit an action click edit. " +
"If you want to delete an action, press delete " +
"Click on the action you want to edit or delete")
.setPositiveButton("Edit", (dialog, which) -> {
new EnterReasonandValueDialogClass((dialog1, which1, mContext, et_reason, et_value) -> {
...
}
})
.setNegativeButton("Delete", (dialog, which) -> {
...
}).create().show();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.