ローエド-色を変えるボタン+トーストをクリック


MainActivity


変更はありません.接続するファイルがactivity_mainでない場合は、そのファイルのみを変更します.
package com.techtown.test08;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

activity_main.xml


画面構成.作成に必要なTextViewButton 화면.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="13dp"
        android:text="Hello World" />

    <com.techtown.test08.MyButton
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:id="@+id/button"
        android:text="확인"
        android:layout_centerInParent="true"/>
</RelativeLayout>
Hello Worldが設けられ、画面上部の中央にTextViewが表示され、MyButtonファイルに接続されたスペースも提供される.

MyButton.java


これは、必要なコンテンツを正式に作成するjavaファイルです.デフォルト設定の背景色とフォント色があり、押下時(タッチ時)操作の背景色とフォント色を設定します
package com.techtown.test08;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

import androidx.appcompat.widget.AppCompatButton;

public class MyButton extends AppCompatButton {


    public MyButton(Context context) {
        super(context);
        init(context);
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public void init(Context context) {
        // 기본 배경 색상
        setBackgroundColor(Color.CYAN);
        // 기본 글씨 색상
        setTextColor(Color.BLACK);
        // 글씨 크기 app/res/values 폴더에 dimens.xml 파일 만들고 내용
        float textSize = getResources().getDimension(R.dimen.text_size);
        // sp 단위로 설정하기 위해 xml 파일을 이용하는 것
        setTextSize(textSize);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 로그 호출
        Log.d("MyButton", "온 드로우 호출");
    }

    // 뷰가 터치 되었를 때 호출되는 메소드
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 로그 호출
        Log.d("MyButton", "온 터치 이벤트 호출");

        // event에 action 받기
        int action = event.getAction();

        switch (action) {
            // 눌렸을 때 작동하는 case
            case MotionEvent.ACTION_DOWN:
                // 배경은 파란색으로
                setBackgroundColor(Color.BLUE);
                // 글씨는 붉은 색이 된다
                setTextColor(Color.RED);
                break;

            case MotionEvent.ACTION_OUTSIDE:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                setBackgroundColor(Color.CYAN);
                setTextColor(Color.BLACK);
                break;
        }
        // 뷰 다시 그리기
        invalidate();

        return true;
    }
}
initの部分を見ていると、フォントサイズを直接書くのではなく、別途設定ファイルを作成して接続しています.これは、setTextSize()の方法で設定する場合、画素単位しか設定できないためです.ピクセルの値は固定されているので、画面サイズで表されるsp単位を使用するのが望ましいです.sp単位を使用する場合は、xmlファイルで個別に設定して接続する必要があります.と言います.

dimens.xml


フォントサイズをspに設定したファイルを個別に接続するには、対応するファイルを記入する必要があります.前述したように、res/valuesにおいてファイルが生成される.一行書いても大丈夫です.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="text_size">
        20sp
    </dimen>
</resources>

実行画面


初めて実行すると、一番上の真ん中にHello Worldが出ている様子と、真ん中に確認字が入っているブロックが見えます.

そして확인 버튼(?を押すと色が変わったことが確認できます.クリックして最初の画面に戻ります

トーストメッセージ


でもちょっと残念だったのでトースト情報をつけることにしました押すと버튼이 눌렸습니다となります
検索してみると、思ったより追加方法が簡単だった.Toast.makeText(getApplicationContext(), "출력하고픈 메시지", Toast.LENGTH_SHORT).show();ここでSHORTを使うと少し短いLONGだと画面にもっと長く露出します
要素の詳細は、次のとおりです.
// context : 안드로이드 시스템에 있는 class와 자원들을 앱 level 까지 올려주는 것
// ex. 액티비티 시작하기, 브로드 캐스팅하기, 인텐트 주고 받기
Context context = getApplicationContext();

// 전송할 text
CharSequence text = "메시지";

// 화면에 얼마나 길게 노출시킬 것인가?
int duration = Toast.LENGTH_SHORT;

Toast toast = Toast.makeText(context, text, durration);
toast.show();

誤り


でもこれはダメgetApplicationContext()の部分はいつもおかしいです前に使った時はこれだったみたいですよね?交換しようとしても無理なので検索してみました.

Contextには2種類あります

  • アプリケーションコンテキスト:アプリケーションに関連付けられ、アプリケーションが終了して再実行された場合にのみ変更されます.
  • Activity context:Activityに関連付けられており、このActivityをオフにして再実行することで、Activity contextも変化します(-1つのアプリケーションに複数のActivityを含めることができることを覚えておいてください)
  • だから、this vs getApplicationContext()?


    2つのテキストのthis = activity contextgetApplicationContext() = application contextと呼びます.そのため、ほとんどの場合、2種類を混ぜて使っても問題はありません.
    ただしthisを入れましたが、エラーが発生した場合は、その活動性が正しいかどうかを確認してください.getApplicationContext()を入れました.だめなら、これを入れます.

    これもだめだと思います。


    this = getBaseContext() = getContext() = Activity Context
    getApplicationContext() = getApplication() = Application Context
    つまり、getContext()を使用したことがあります.使用方法を聞いて、これは対応するアクティブなデバイスに関連付けられていることに気づきました.これは向上した値ではないからです.Toast.makeText(getContext(), "버튼 누름", Toast.LENGTH_SHORT).show();書き上げる.スイッチ-キャビネットドアのビューが押されている場合に位置します.
    ...
            switch (action) {
                // 눌렸을 때 작동하는 case
                case MotionEvent.ACTION_DOWN:
                    // 배경은 파란색으로
                    setBackgroundColor(Color.BLUE);
                    // 글씨는 붉은 색이 된다
                    setTextColor(Color.RED);
                    // 토스트 창도 띄워짐
                    Toast.makeText(getContext(), "버튼 누름", Toast.LENGTH_SHORT).show();
                    break;
    ...

    実行画面



    ボタンを押した場合.ボタンは元の状態に戻り、下にボタンが押された情報が表示され、しばらくして消えてしまった.