使用AlertDialog.Builder构建自定义AlertDialog类

时间:2016-04-05 13:07:05

标签: android alertdialog

我有一个类FoodDialog,它扩展了AlertDialog,我已根据自己的需要进行了定制。

我现在想要使用AlertDialog.Builder编辑正面/负面按钮,但是,当我尝试使用构建器构建FoodDialog的实例时,我面临着一个“不兼容”的问题。类型'构建器要求AlertDialog而不是我提供AlertDialog扩展名的错误 - 是否可以解决此问题?

如果没有,我是否可以编辑自定义AlertDialog课程FoodDialog的正/负按钮?

以下是我的FoodDialog课程。我在那里的是/否按钮是我自己创建的按钮,但我希​​望那些属于AlertDialog.Builder的按钮出现,因为当软键盘出现时这些按钮被推开了:

public class FoodDialog extends AlertDialog implements OnClickListener {

    private TextView foodNameTextView, foodDescTextView, foodPortionTextView, catTextView, qtyText, cal, fat, sFat, carb, sug, prot, salt, imageTxt,
            measureText;
    private EditText foodQty;
    private ImageView foodImage;
    private ImageButton yesBtn, noBtn;
    private int foodID, totalCal;
    private Bitmap image;
    private String user, portionType, foodName, foodDesc, cat, totalCalString, totalFatString,
            totalSFatString, totalCarbString, totalSugString, totalProtString, totalSaltString, portionBaseString;
    private double totalFat, totalSFat, totalCarb, totalSug, totalProt, totalSalt, portionBase;
    private Food food;
    private Portion portion;
    private Nutrients nutrients;
    private PortionType pType;
    private DBHandler db;

    public FoodDialog(Context context){
        super(context);

    }

    public FoodDialog(Context context, int foodID, String imgLocation, final String user) {
        super(context, android.R.style.Theme_Holo_Light_Dialog);
        this.setTitle("Confirm?");
        setContentView(R.layout.dialog_layout);
        this.foodID = foodID;
        this.user = user;

        db = new DBHandler(context);
        food = db.getFoodByID(foodID, user);
        portion = db.getPortionByFoodID(foodID);
        nutrients = db.getNutrientsByFoodIDAndPortionType(foodID, portion.getPortionType());
        pType = db.getPortionTypeByName(portion.getPortionType());

        //getting object attributes
        portionType = portion.getPortionType();
        portionBase = portion.getPortionBase();

        //food
        foodName = food.getName();
        foodDesc = food.getDesc();
        cat = food.getCat();

        //nutrients
        totalCal = nutrients.getCal();
        totalFat = nutrients.getFat();
        totalSFat = nutrients.getSFat();
        totalCarb = nutrients.getCarb();
        totalSug = nutrients.getSug();
        totalProt = nutrients.getProt();
        totalSalt = nutrients.getSalt();

        //converting to string
        totalCalString = String.valueOf(totalCal);

        if (totalFat % 1 == 0) {
            totalFatString = String.format("%.0f", totalFat);
        } else {
            totalFatString = String.valueOf(totalFat);
        }

        if (totalSFat % 1 == 0) {
            totalSFatString = String.format("%.0f", totalSFat);
        } else {
            totalSFatString = String.valueOf(totalSFat);
        }

        if (totalCarb % 1 == 0) {
            totalCarbString = String.format("%.0f", totalCarb);
        } else {
            totalCarbString = String.valueOf(totalCarb);
        }

        if (totalSug % 1 == 0) {
            totalSugString = String.format("%.0f", totalSug);
        } else {
            totalSugString = String.valueOf(totalSug);
        }

        if (totalProt % 1 == 0) {
            totalProtString = String.format("%.0f", totalProt);
        } else {
            totalProtString = String.valueOf(totalProt);
        }

        if (totalSalt % 1 == 0) {
            totalSaltString = String.format("%.0f", totalSalt);
        } else {
            totalSaltString = String.valueOf(totalSalt);
        }

        if (portionBase % 1 == 0) {
            portionBaseString = String.format("%.0f", portionBase);
        } else {
            portionBaseString = String.valueOf(portionBase);
        }

        //textviews
        foodNameTextView = (TextView) findViewById(R.id.dialogName);
        foodNameTextView.setText(foodName);
        foodDescTextView = (TextView) findViewById(R.id.dialogDesc);
        foodDescTextView.setText(foodDesc);
        foodPortionTextView = (TextView) findViewById(R.id.dialogPortion);
        foodPortionTextView.setText("Values based per " + portionBase + " " + portionType);
        catTextView = (TextView) findViewById(R.id.dialogCat);
        catTextView.setText(cat);
        measureText = (TextView) findViewById(R.id.dialogMeasure);
        measureText.setText(portionType);
        qtyText = (TextView) findViewById(R.id.dialogQtyText);
        imageTxt = (TextView) findViewById(R.id.dialogImageText);
        cal = (TextView) findViewById(R.id.dialogCal);
        cal.setText(totalCalString);
        fat = (TextView) findViewById(R.id.dialogFat);
        fat.setText(totalFatString + "g");
        sFat = (TextView) findViewById(R.id.dialogSFat);
        sFat.setText(totalSFatString + "g");
        carb = (TextView) findViewById(R.id.dialogCarb);
        carb.setText(totalCarbString + "g");
        sug = (TextView) findViewById(R.id.dialogSug);
        sug.setText(totalSugString + "g");
        prot = (TextView) findViewById(R.id.dialogProt);
        prot.setText(totalProtString + "g");
        salt = (TextView) findViewById(R.id.dialogSalt);
        salt.setText(totalSaltString + "g");

        //img
        foodImage = (ImageView) findViewById(R.id.dialogImage);
        imgLocation = food.getImgURL();
        image = BitmapFactory.decodeFile(imgLocation);
        foodImage.setImageBitmap(image);

        if (imgLocation.equals("nourl")) {
            imageTxt.setText("No Image");
        }

        //edit tex
        foodQty = (EditText) findViewById(R.id.dialogQty);

        //adjusting edittext
        foodQty.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
        foodQty.setFilters(new InputFilter[]{
                new DigitsKeyListener(Boolean.FALSE, Boolean.TRUE) {
                    int beforeDecimal = 4, afterDecimal = 3;

                    @Override
                    public CharSequence filter(CharSequence source, int start, int end,
                                               Spanned dest, int dstart, int dend) {
                        String temp = foodQty.getText() + source.toString();

                        if (temp.equals(".")) {
                            return "0.";
                        } else if (temp.toString().indexOf(".") == -1) {
                            // no decimal point placed yet
                            if (temp.length() > beforeDecimal) {
                                return "";
                            }
                        } else {
                            temp = temp.substring(temp.indexOf(".") + 1);
                            if (temp.length() > afterDecimal) {
                                return "";
                            }
                        }
                        return super.filter(source, start, end, dest, dstart, dend);
                    }
                }
        });
        foodQty.setText(portionBaseString);

        //btns
        yesBtn = (ImageButton) findViewById(R.id.yesBtn);
        noBtn = (ImageButton) findViewById(R.id.noBtn);

        Bitmap tick = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.png_tick);

        Bitmap cross = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.png_cross);

        yesBtn.setImageBitmap(tick);
        noBtn.setImageBitmap(cross);

        yesBtn.setOnClickListener(this);
        noBtn.setOnClickListener(this);

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }


    @Override
    public void onClick(View v) {

        if (v == yesBtn) {
            SimpleDateFormat currentDate = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm:ss");
            String date = currentDate.format(new Date());
            String time = currentTime.format(new Date());

            double qty = 0;
            //get quantity amount
            // if (portionMeasure.equals("singles")) {
            //qty = foodQty.getValue();
            // } else {
            if (foodQty.getText().length() != 0) {
                qty = Double.valueOf(foodQty.getText().toString());
            } else {
                qty = 0;
            }
            // }
            if (qty == 0 || String.valueOf(qty) == "") {

                Toast.makeText(getContext(), "Please enter an amount", Toast.LENGTH_SHORT).show();
            } else {
                //create new intake
                Intake intake = new Intake(0, foodID, portionType, qty, date, time);
                //record it and increment food used value
                db.recordIntake(intake, user);
                db.incrementUsedCount(intake.getFoodID(), 1);
                db.close();
                cancel();
                Toast.makeText(getContext(), foodName + " recorded", Toast.LENGTH_SHORT).show();
                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                builder.setTitle("What next?");
                builder.setItems(new CharSequence[]
                                {"Record another food intake..", "Main Menu..", "View Stats.."},
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                // The 'which' argument contains the index position
                                // of the selected item
                                switch (which) {
                                    case 0:
                                        cancel();
                                        break;
                                    case 1:
                                        Intent main = new Intent(getContext(), ProfileActivity.class);
                                        getContext().startActivity(main);
                                        break;
                                    case 2:
                                        Intent stats = new Intent(getContext(), StatsActivity.class);
                                        getContext().startActivity(stats);
                                        break;
                                }
                            }
                        });
                AlertDialog choose = builder.create();
                choose.show();
            }

        } else if (v == noBtn) {
            cancel();
        }

    }

}

1 个答案:

答案 0 :(得分:0)

您可以按如下方式捕捉按钮单击侦听器:

yesBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //yes button click code here
        }
    });

noBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //no button click code here
        }
    });

您可以使用logcat查看您的侦听器是否被触发。

相关问题