หากไม่กดปุ่มอีกครั้งภายใน 10 วินาที ให้ส่งการแจ้งเตือน

ฉันมีปุ่ม ("ตรวจสอบ") ซึ่งเริ่มนับถอยหลังซึ่งเมื่อถึงศูนย์โทรศัพท์จะสั่น การกด "ตรวจสอบ" อีกครั้งจะปิดการสั่นและกระบวนการจะเริ่มต้นใหม่ การกด "แจ้งเตือน" จะส่ง SMS ไปยังหมายเลขที่กำหนดไว้ล่วงหน้าเมื่อใดก็ได้ นั่นคือรหัสของฉันจนถึงตอนนี้ และเท่าที่เป็นไป มันก็ทำงานได้ดี แต่ฉันต้องการเชื่อมต่อฟังก์ชันเหล่านี้ เพื่อที่ว่าเมื่อการสั่นเริ่มต้นขึ้น ผู้ใช้จะมีเวลาสิบวินาทีในการแตะ "ตรวจสอบ" และรีสตาร์ทตัวจับเวลา ไม่เช่นนั้นฟังก์ชัน "แจ้งเตือน" จะเริ่มโดยส่ง SMS ฉันจะไปเกี่ยวกับเรื่องนี้ได้อย่างไร? ฉันจะต้องนับถอยหลังอีกหรือไม่?

รหัสปุ่ม "ตรวจสอบ" จนถึงปัจจุบัน:

check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vibe.cancel();
                if (countDownTimer != null)
                    countDownTimer.cancel();

                countDownTimer = new CountDownTimer(timerTime * 1000, 1000) {

                    @Override
                    public void onTick(long milliseconds) {
                        long minutes = milliseconds / 60000;
                        long seconds = (milliseconds / 1000) % 60;
                        minsLeft.setText(getString(R.string.minutes) + (int) (minutes) + "  seconds:" + (int) (seconds));

                    }

                    @Override
                    public void onFinish() {
                        minsLeft.setText("Are You OK?");
                        long[] pattern = {100, 1000, 100, 2};
                        vibe.vibrate(pattern, 1);
                    }
                }.start();
            }
        });
    }

รหัสปุ่ม "แจ้งเตือน" (จะเรียกว่ารหัสนี้หากไม่ได้กด "ตรวจสอบ" อีกครั้ง):

    public void onAlertClick(View view) {
        Toast sent = Toast.makeText(getApplicationContext(), "Alert Sent", Toast.LENGTH_SHORT);
        Toast permissions = Toast.makeText(getApplicationContext(), "Please change app permissions in settings", Toast.LENGTH_SHORT);


        try {
            SmsManager.getDefault().sendTextMessage(getString(R.string.smsNumber), null,
                    getString(R.string.smsMessage), null, null);
            sent.show();

        } catch (Exception e) {
            permissions.show();
        }
    }

person Molly Taylor    schedule 01.04.2017    source แหล่งที่มา
comment
โปรดใช้แท็ก android studio สำหรับคำถามเกี่ยวกับการเขียนโปรแกรมทั่วไปเท่านั้น - ใช้สำหรับคำถามเกี่ยวกับตัวเครื่องมือเอง   -  person EJoshuaS - Reinstate Monica    schedule 01.04.2017
comment
คุณได้แสดงโค้ดมากมายที่นี่ ซึ่งดี แต่คุณไม่ได้อธิบายปัญหามากนัก มีข้อผิดพลาดใน logcat หรือไม่? มีบางอย่างไม่เกิดขึ้นอย่างที่คุณคาดหวังใช่ไหม? คุณคาดหวังอะไร? คุณมีแนวโน้มที่จะดึงดูดคำตอบได้มากขึ้น (และดีกว่า) หากคุณให้รายละเอียดเพิ่มเติมที่นี่   -  person HPierce    schedule 01.04.2017
comment
@HPierce (และ EJoshuaS) ฉันได้ทำการเปลี่ยนแปลงคำถามและแท็กของฉัน ฉันไม่แน่ใจว่าจะทำให้สิ่งนี้เจาะจงมากขึ้นได้เพราะฉันไม่รู้ว่าจะเริ่มต้นจากตรงไหน อย่างไรก็ตาม ฉันได้ทำการเปลี่ยนแปลงบางอย่างเพื่อชี้แจงคำถามของฉัน หวังว่าจะช่วยได้   -  person Molly Taylor    schedule 01.04.2017


คำตอบ (1)


สิ่งที่ฉันจะทำคือสร้างส่วนของกล่องโต้ตอบเมื่อตัวจับเวลาตัวแรกเสร็จสิ้น จากนั้นในส่วนของกล่องโต้ตอบนั้นจะมีตัวจับเวลาอื่นที่นับถอยหลัง 10 วินาที - หากตัวจับเวลาของกล่องโต้ตอบแตะ 0 ให้ดำเนินการตามวิธีแจ้งเตือนของคุณ:

(ป.ล. คุณสามารถซ้อนคลาสนี้ไว้ในคลาสหลักของคุณได้ เพื่อที่คุณจะได้เรียกตัวนับเวลาถอยหลังครั้งแรกได้ง่ายขึ้น)

public static class SessionExpiringDialog extends DialogFragment {
    CountDownTimer countDownTimer2;
    public SessionExpiringDialog() {
        super();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        final View view = inflater.inflate(R.layout.session_dialog, null);
        final TextView sessionText = (TextView) view.findViewById(R.id.session_text);
        countDownTimer2 = new CountDownTimer2(11000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                long diffSeconds = millisUntilFinished / 1000 % 60;
                sessionText.setText("SMS Alert will be sent in: " + diffSeconds + " seconds.");
            }

            @Override
            public void onFinish() {
                onAlertClick(view);
            }
        };
        countDownTimer2.start();
        builder.setView(view);
        builder.setMessage("Alert SMS Pending").setTitle("ATTENTION:")
                .setPositiveButton("I'm OKAY!", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        countDownTimer2.cancel();
                        countDownTimer.start();
                        dismiss();
                    }
                });
        return builder.create();
    }
}

รหัสนี้ถือว่ามีเค้าโครง xml ที่เรียกว่า res/layout/session_dialog.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">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/session_text"
    android:textSize="20sp"
    android:textStyle="bold"
    android:layout_gravity="center"

    />

</LinearLayout>

หากต้องการเรียกโค้ดนี้ ให้ใส่ไว้ในเมธอด onFinish() ของตัวนับถอยหลังตัวแรกของคุณ:

check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            vibe.cancel();
            if (countDownTimer != null)
                countDownTimer.cancel();

            countDownTimer = new CountDownTimer(timerTime * 1000, 1000) {

                @Override
                public void onTick(long milliseconds) {
                    long minutes = milliseconds / 60000;
                    long seconds = (milliseconds / 1000) % 60;
                    minsLeft.setText(getString(R.string.minutes) + (int) (minutes) + "  seconds:" + (int) (seconds));

                }

                @Override
                public void onFinish() {
                    minsLeft.setText("Are You OK?");
                    long[] pattern = {100, 1000, 100, 2};
                    vibe.vibrate(pattern, 1);
                    SessionExpiringDialog sessionExpiringDialog = new SessionExpiringDialog();
                    sessionExpiringDialog.setCancelable(false);
                    sessionExpiringDialog.show(getSupportFragmentManager(), "tag");
                }
            }.start();
        }
    });
}

สุดท้ายนี้ ฉันไม่เข้าใจว่าทำไมคุณถึงส่งมุมมองในเมธอด onAlertClick() ของคุณ แต่ฉันได้ดำเนินการต่อและรวมไว้ในโค้ดที่วางแล้ว

person buradd    schedule 01.04.2017