stop watch

public class MainActivity extends AppCompatActivity {

    private long startTime;
    private long elapsedTime = 0l;

    private Handler handler = new Handler();
    private Runnable updateTimer;

    private Button startButton;
    private Button stopButton;
    private Button resetButton;
    private TextView timerLabel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startButton = (Button) findViewById(R.id.startButton);
        stopButton = (Button) findViewById(R.id.stopButton);
        resetButton = (Button) findViewById(R.id.resetButton);
        timerLabel = (TextView) findViewById(R.id.timerLabel);

        setButtonState(true,false,false);
    }

    public void setButtonState(boolean start, boolean stop, boolean reset){
        startButton.setEnabled(true);
        stopButton.setEnabled(false);
        resetButton.setEnabled(false);

    }

    public void startTimer(View view){
        // startTimeの取得
        startTime = SystemClock.elapsedRealtime(); // 起動してからの経過時間(ミリ秒)

        // 一定時間ごとに現在の経過時間を表示
        // handler -> Runnable(処理) -> UI
        updateTimer = new Runnable(){
            @Override
            public void run(){
                long t = SystemClock.elapsedRealtime() - startTime + elapsedTime;
                SimpleDateFormat sdf = new SimpleDateFormat("mm:ss.SSS", Locale.US);
                timerLabel.setText(sdf.format(t));
                handler.removeCallbacks(updateTimer);
                handler.postDelayed(updateTimer, 10);
            }
        };
        handler.postDelayed(updateTimer, 10);


        // ボタンの操作
        setButtonState(false, true, false);
    }

    public void stopTimer(View view){
        elapsedTime += SystemClock.elapsedRealtime() - startTime;
        handler.removeCallbacks(updateTimer);
        setButtonState(true,false, true);
    }

    public void resetTimer(View view){
        elapsedTime = 0;
        timerLabel.setText("00:00.000");
        setButtonState(true,false, false);
    }
}

runnable、SimpleDateFormat、removeCallbacks、handlerがよくわからんな。

SystemClock.elapsedRealtime();

SystemClock.elapsedRealtime();はdeveloperの公式ページに掲載されています。
https://developer.android.com/reference/android/os/SystemClock
elapsedRealtime() and elapsedRealtimeNanos() return the time since the system was booted, and include deep sleep. This clock is guaranteed to be monotonic, and continues to tick even when the CPU is in power saving modes, so is the recommend basis for general purpose interval timing.

public void startTimer(View view){
        // startTimeの取得
        startTime = SystemClock.elapsedRealtime(); // 起動してからの経過時間(ミリ秒)

        // 一定時間ごとに現在の経過時間を表示
        // handler -> Runnable(処理) -> UI
        updateTimer = new Runnable(){
            @Override
            public void run(){
                long t = SystemClock.elapsedRealtime() - startTime;
                SimpleDateFormat sdf = new SimpleDateFormat("mm:ss.SSS", Locale.US);
                timerLabel.setText(sdf.format(t));
                handler.removeCallbacks(updateTimer);
                handler.postDelayed(updateTimer, 10);
            }
        };
        handler.postDelayed(updateTimer, 10);


        // ボタンの操作
        setButtonState(false, true, false);
    }

setEabled(true)とsetEnabled(false)

setEnabledでtrueだとbuttonを押せる。

private Button startButton;
    private Button stopButton;
    private Button resetButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startButton = (Button) findViewById(R.id.startButton);
        stopButton = (Button) findViewById(R.id.stopButton);
        resetButton = (Button) findViewById(R.id.resetButton);

        setButtonState(true,false,false);
    }

    public void setButtonState(boolean start, boolean stop, boolean reset){
        startButton.setEnabled(true);
        stopButton.setEnabled(false);
        resetButton.setEnabled(false);

    }

firstname, lastname, phone, emailをintentする

public void getScore(View view){


        // edittextを取得
        EditText fEditText = (EditText) findViewById(R.id.firstnEditText);
        EditText lEditText = (EditText) findViewById(R.id.lastnEditText);
        EditText pEditText = (EditText) findViewById(R.id.phoneEditText);
        EditText mEditText = (EditText) findViewById(R.id.mailEditText);
        // edittextの中身を取得
        String firstName = fEditText.getText().toString().trim();
        String lastName = lEditText.getText().toString().trim();
        String myPhone = pEditText.getText().toString().trim();
        String myMail = mEditText.getText().toString().trim();

        Pattern p = Pattern.compile("^[0-9\\-]+");
        Matcher m = p.matcher(myPhone);

        Pattern mp = Pattern.compile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$");
        Matcher mm = mp.matcher(myMail);

        // 中身を観て条件分岐
       if (firstName.equals("")){
             fEditText.setError("Please enter your first name!");
        } else if(lastName.equals("")){
           lEditText.setError("Please enter your last name!");
        } else if(myPhone.equals("") || m.find() == false){
           pEditText.setError("Please enter your phone number!");
        }else if(myMail.equals("") || mm.find() == false){
           mEditText.setError("Please enter your valid email");
        } else {
            Intent intent = new Intent(this, MyResult.class);
            intent.putExtra(EXTRA_MYFNAME, firstName);
           intent.putExtra(EXTRA_MYLNAME, lastName);
           intent.putExtra(EXTRA_MYPHONE, myPhone);
           intent.putExtra(EXTRA_MYMAIL, myMail);
            startActivity(intent);
        }
    }

入力すると

引き継がれる! EditTextは良さそうですね。

EditTextがnullもしくは[0-9\\-]を判定する

MainActivity.javaで電話番号の判定
Pattern p = Pattern.compile(“^[0-9\\-]+”); として、EditTextが数字・ハイフンか正規表現を行う
javaのORは||なので、myPhone.equals(“”) || m.find() == false とする

public void getScore(View view){


        // edittextを取得
        EditText fEditText = (EditText) findViewById(R.id.firstnEditText);
        EditText lEditText = (EditText) findViewById(R.id.lastnEditText);
        EditText pEditText = (EditText) findViewById(R.id.phoneEditText);
        EditText mEditText = (EditText) findViewById(R.id.mailEditText);
        // edittextの中身を取得
        String firstName = fEditText.getText().toString().trim();
        String lastName = lEditText.getText().toString().trim();
        String myPhone = pEditText.getText().toString().trim();
        String myMail = mEditText.getText().toString().trim();

        Pattern p = Pattern.compile("^[0-9\\-]+");
        Matcher m = p.matcher(myPhone);

        // 中身を観て条件分岐
       if (firstName.equals("")){
             fEditText.setError("Please enter your first name!");
        } else if(lastName.equals("")){
           lEditText.setError("Please enter your last name!");
        } else if(myPhone.equals("") || m.find() == false){
           pEditText.setError("Please enter your phone number!");
        }else if(myMail.equals("")){
           mEditText.setError("Please enter your first name!");
        } else {
            Intent intent = new Intent(this, MyResult.class);
            intent.putExtra(EXTRA_MYNAME, firstName);
            startActivity(intent);
        }
    }

おお、Androidの開発の仕方が少しづつ掴めてきた。まずjavaで関数の挙動を確認して、studioで実機確認。php+vagrantとほぼ同じ。

続けてメールアドレスの判定も行いたい

javaのif else

else if() で書きます。

public void getScore(View view){
        // edittextを取得
        EditText fEditText = (EditText) findViewById(R.id.firstnEditText);
        EditText lEditText = (EditText) findViewById(R.id.lastnEditText);
        EditText pEditText = (EditText) findViewById(R.id.phoneEditText);
        EditText mEditText = (EditText) findViewById(R.id.mailEditText);
        // edittextの中身を取得
        String firstName = fEditText.getText().toString().trim();
        String lastName = lEditText.getText().toString().trim();
        String myPhone = pEditText.getText().toString().trim();
        String myMail = mEditText.getText().toString().trim();

        // 中身を観て条件分岐
       if (firstName.equals("")){
             fEditText.setError("Please enter your first name!");
        } else if(lastName.equals("")){
           lEditText.setError("Please enter your last name!");
        } else if(myPhone.equals("")){
           pEditText.setError("Please enter your phone number!");
        }else if(myMail.equals("")){
           mEditText.setError("Please enter your first name!");
        } else {
            Intent intent = new Intent(this, MyResult.class);
            intent.putExtra(EXTRA_MYNAME, firstName);
            startActivity(intent);
        }
    }

androidだとbuildに時間がかかるので、javaのplaygroundで関数の挙動を確かめながらやった方が速いですね。
https://code.sololearn.com/cVRUy2BwauK8/#java

電話番号とメールはバリデーションをかけたい。phoneはtoString? 電話だからstringでいいのか?

javaのrandomGenerator

randomGeneratorのclassを使う
randomGenerator.nextInt(101)で0~100のランダムな数を生成する
int型をstring型にキャストする場合は、String.valueOfを使う

        Random randomGenerator = new Random();
        int score = randomGenerator.nextInt(101);
        TextView scoreLabel = (TextView) findViewById(R.id.scoreLabel);
        scoreLabel.setText(String.valueOf(score) + "点!");

OKのようです。phpで作っていく場合は、ほとんど挙動をつくってからstylingでしたが、androidの場合は、stylingにちかい記述(layoutのxml)をはじめっから書いてしまう、というのが進め方として違いますね。

遷移先でのintentの取得方法

intent.getStringExtra(MainActivity.Key) で値を取得する。いわゆるphpの$_POST(“hoge”)みたいなイメージ
textviewに入れ込むには、findViewById にsetText
Javascriptのdocument.ElementGetByIdにそっくりなので、覚えやすいですね。

Intent intent = getIntent();
        String myName = intent.getStringExtra(MainActivity.EXTRA_MYNAME);
        TextView nameLabel = (TextView) findViewById(R.id.nameLabel);
        nameLabel.setText(myName + "の点数は...");

値を引き継いでいます。

.putExtraでEditTextのvalueとkeyを渡す

intent.putExtra(key, myEditText.getText().toString().trim())
引数1は、packageと名前をつけることが推奨されているので、public finalで、定義する。

public final static String EXTRA_MYNAME = "com.capital.scoreapp.myname";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void getScore(View view){


        // edittextを取得
        EditText myEditText = (EditText) findViewById(R.id.myEditText);
        // edittextの中身を取得
        String myName = myEditText.getText().toString().trim();
        // 中身を観て条件分岐
       if (myName.equals("")){
//            // エラー処理
             myEditText.setError("Please enter your name!");
//            Toast.makeText(
//                    this,
//                    "please enter your name!",
//                    Toast.LENGTH_LONG
//            ).show();
//        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
//        alertDialogBuilder
//                .setTitle("Error!")
//                .setMessage("Please enter your name!")
//                .setPositiveButton("OK", null);
//        AlertDialog alertDialog = alertDialogBuilder.create();
//        alertDialog.show();
        } else {
            Intent intent = new Intent(this, MyResult.class);
            intent.putExtra(EXTRA_MYNAME, myName);
            startActivity(intent);
        }
    }