짱짱해커가 되고 싶은 나

07-2. 토스트 & 대화상자 본문

모바일

07-2. 토스트 & 대화상자

동로시 2021. 2. 20. 12:48

* Toast

- makeText(context, message, duration)

context는 현재 화면(액티비티)를 표시하기 위해 this를 주로 사용(내부 클래스에서는 액티비티명.this)

- setGravitiy(gravity, xOffset, yOffset)

- show()

 

진짜 스트레스 나는 setGravitiy가 적용이 안된다;; setGravitiy()하고 show()했는데에에에에!!!

왜인지는 모르겠는데 toast 뷰를 inflate 해서 하면 적용이 된다.. 왜 이러는지 아는사람..........ㅠㅠㅠ

 

<activity_main.xml>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:gravity="center"
    android:id="@+id/baseLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메시지 출력"/>


</LinearLayout>

<toast.xml>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="토스트 연습"/>

</LinearLayout>

<MainActivity.java>

package com.example.menu;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Display;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    View toastView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("토스트 연습");

        final Button btn1 = (Button)findViewById(R.id.btn1);
        toastView = (View)View.inflate(MainActivity.this, R.layout.toast, null);

        btn1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Toast msg = new Toast(MainActivity.this);
                msg.setView(toastView);
                Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
                int xOffset = (int)(Math.random() * display.getWidth());
                int yOffset = (int)(Math.random() * display.getHeight());

                msg.setGravity(Gravity.TOP|Gravity.LEFT, xOffset, yOffset);
                msg.show();

            }
        });
    }
}

 

* 대화상자(dialog)

화면에 메시지를 나타낸 후 확인/취소 같은 사용자의 선택을 받아들이는 경우 사용

package com.example.message;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        final Button btn = (Button)findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
                dlg.setTitle("제목입니다");
                dlg.setMessage("이곳이 내용입니다");
                dlg.setIcon(R.mipmap.ic_launcher);
                dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Toast.makeText(MainActivity.this, "확인을 눌렀네요", Toast.LENGTH_SHORT).show();
                            }
                        });
                dlg.show();
            }
        });

    }
}

AlertDialog.Builder 를 이용해 생성한다.

- setTitle() : 제목 설정

- setMessage() : 내용 입력

- setPositivieButton(text, 리스너)

new AlertDialog.Builder(MainActivity.this).
setTitle("제목입니다")
.setMessage("이곳이 내용입니다")
.setIcon(R.mipmap.ic_launcher).show();

이런 식으로도 사용 가능하다. (함수들의 반환값이 모두 AlertDialog.Builder 이기 때문)

 

* 목록 대화상자

대화상자에 리스트 형태의 목록을 출력하고 그 중 하나를 선택하게 할 수 있다.

package com.example.message;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        final Button btn = (Button)findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String[] versionArray = new String[]{"오레오", "파이", "큐(10)"};
                AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
                dlg.setTitle("좋아하는 버전은?");
                dlg.setIcon(R.mipmap.ic_launcher);
                dlg.setItems(versionArray, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        btn.setText(versionArray[which]);
                    }
                });
                dlg.setPositiveButton("닫기", null);
                dlg.show();
            }
        });

    }
}

- setItems(문자열 배열, 리스너) : onClick()에서 which는 목록의 index에 해당하고 목록을 선택하면 대화상자가 자동으로 닫힌다.

 

- setSingleChoiceItems(문자열 배열, 초기 선택 번호, 리스너) : 라디오버튼 형식으로 선택해도 대화상자가 닫히지 않는다.

dlg.setSingleChoiceItems(versionArray, 0, new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
	btn.setText(versionArray[which]);
	}
});

 

- setMultiChoiceItems(문자열 배열, 체크 여부, 리스너) : 체크박스 형태로 여러개 선택이 가능하며 선택해도 대화상자가 닫히지 않는다. 이 때 문자열 배열의 수와 체크 배열의 수는 같아야 한다.

final boolean[] checkArray = new boolean[]{true, false, false};
dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked) {
		btn.setText(versionArray[which]);
	}
});

 

'모바일' 카테고리의 다른 글

08-1. 파일 처리  (0) 2021.02.22
07-3. 메뉴/토스트/다이얼로그 연습  (0) 2021.02.20
07-1. 메뉴  (0) 2021.02.20
06-4. 뷰 컨테이너 연습  (0) 2021.02.19
06-3. 뷰 컨테이너  (0) 2021.02.19
Comments