사용자에게 정보를 전달하거나 선택을 입력 받는 용도로 사용한다.
정보 전달의 경우에는 확인 버튼으로 확인하는 것이 필요하다.
#실습 1
- 목록을 롱클릭하면 아래 그림과 같은 <음식삭제> 다이얼로그 생성하고 삭제하기
<MainActivity.java>
package ddwucom.mobile.week11.exam01;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ListView listView;
ArrayAdapter adapter;
ArrayList<Food> foodList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
foodList = new ArrayList<Food>();
foodList.add(new Food("김치찌개", "한국"));
foodList.add(new Food("된장찌개", "한국"));
foodList.add(new Food("훠궈", "중국"));
foodList.add(new Food("딤섬", "중국"));
foodList.add(new Food("초밥", "일본"));
foodList.add(new Food("오코노미야키", "일본"));
// Food 객체의 toString() 메소드가 호출되어 하나의 문자열로 처리됨
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, foodList);
listView.setAdapter(adapter);
// listView 롱클릭 이벤트 추가
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long l){
final int position = pos; //몇 번째를 롱클릭 했는지
String foodName = foodList.get(pos).getFood();
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("음식 삭제"); //대화상자 제목
builder.setMessage(foodName + "을(를) 삭제하시겠습니까?"); //대화상자 메세지
builder.setIcon(R.mipmap.ic_launcher); //대화상자 아이콘
builder.setCancelable(false); //백버튼이나 주변을 눌러도 닫히지 않도록 지정
builder.setPositiveButton("확인", new DialogInterface.OnClickListener() { //listener: 버튼을 눌렀을 때 동작하는 이벤트
@Override
public void onClick(DialogInterface dialogInterface, int i) { //i는 버튼의 순서
foodList.remove(position);
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("취소", null);
builder.show();
return false; //-> builder.show()와 같음
}
});
}
}
1. AlertDialog.Builder
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
.
.
.
다이얼로그를 생성한다.
2. setCancelable(false)
builder.setCancelable(false);
대화상자가 열렸을 때 백버튼이나 주변을 눌러도 닫히지 않도록 하는 설정이다.
따라서 대화상자가 열리면 '확인' 또는 '취소' 버튼을 눌러야만 대화상자를 닫을 수 있다.
3. setPositiveButton(), DialogInterface.OnClickListener()
builder.setPositiveButton("확인", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialogInterface, int i) {
//클릭 시 동작
.
.
setPositiveButton은 대화상자에서 확인버튼을 생성한다.
DialogInterface.OnClickListener()는 대화상자 버튼을 클릭 시 발생하는 이벤트를 설정한다.
4. setNegativeButton()
builder.setNegativeButton("취소", null);
대화상자에서 취소버튼을 생성한다.
5. setNegativeButton()
builder.show();
대화상자를 표시한다.
<activity_main.java>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="나라별 음식"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ListView
android:id="@+id/listView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:id="@+id/bnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:onClick="onClick"
android:text="음식추가"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
#실습 2
- 위 실습을 기반으로 음식을 추가하는 기능 만들어보기
<MainActivity.java>
package ddwucom.mobile.week11.exam01;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
FoodManager foodManager;
ListView listView;
ArrayAdapter adapter;
ArrayList<Food> foodList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
// DataManager 적용해 볼 것
foodList = new ArrayList();
foodList.add(new Food("김치찌개", "한국"));
foodList.add(new Food("된장찌개", "한국"));
foodList.add(new Food("훠궈", "중국"));
foodList.add(new Food("딤섬", "중국"));
foodList.add(new Food("초밥", "일본"));
foodList.add(new Food("오코노미야키", "일본"));
// Food 객체의 toString() 메소드가 호출되어 하나의 문자열로 처리됨
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, foodList);
listView.setAdapter(adapter);
// listView 롱클릭 이벤트 추가
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long l){
final int position = pos; //몇 번째를 롱클릭 했는지
String foodName = foodList.get(pos).getFood();
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("음식 삭제");
builder.setMessage(foodName + "을(를) 삭제하시겠습니까?");
builder.setIcon(R.mipmap.ic_launcher);
builder.setCancelable(false); //백버튼이나 주변을 눌러도 닫히지 않도록 지정
builder.setPositiveButton("확인", new DialogInterface.OnClickListener() { //listener: 버튼을 눌렀을 때 동작하는 이벤트
@Override
public void onClick(DialogInterface dialogInterface, int i) { //i는 버튼의 순서
foodList.remove(position);
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("취소", null);
builder.show();
return false; //-> builder.show()와 같음
}
});
}
//추가 버튼
public void onClick(View v) {
final ConstraintLayout plus_layout =
(ConstraintLayout)View.inflate(this, R.layout.plus_layout, null);
switch (v.getId()){
case R.id.bnt:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("음식 추가");
builder.setView(plus_layout);
builder.setIcon(R.mipmap.ic_launcher);
builder.setCancelable(false); //백버튼이나 주변을 눌러도 닫히지 않도록 지정
builder.setPositiveButton("확인", new DialogInterface.OnClickListener() { //listener: 버튼을 눌렀을 때 동작하는 이벤트
@Override
public void onClick(DialogInterface dialogInterface, int i) { //i는 버튼의 순서
EditText name = plus_layout.findViewById(R.id.name);
EditText country = plus_layout.findViewById(R.id.country);
String etName = name.getText().toString();
String etCountry = country.getText().toString();
foodList.add(new Food(etName, etCountry));
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("취소", null);
builder.show();
}
}
}
1. ConstraintLayout
final ConstraintLayout plus_layout =
(ConstraintLayout)View.inflate(this, R.layout.plus_layout, null);
[음식추가] 버튼을 클릭했을 때 사용하는 레이아웃을 inflation 하는 것이다.
2. setView()
builder.setView(plus_layout);
레이아웃을 inflation 한 후에 대화상자에 레이아웃을 설정하는 것이다.
3. findViewById()
EditText name = plus_layout.findViewById(R.id.name);
EditText country = plus_layout.findViewById(R.id.country);
다이얼로그의 layout인 plus_layout에 배치한 뷰를 접근한다.
<plus_layout.java>
- [음식추가] 화면
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView1"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="음식명"
android:textColor="#000000"
android:textSize="20dp"
app:layout_constraintBottom_toTopOf="@+id/name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.051"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.64" />
<EditText
android:id="@+id/name"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:ems="10"
android:hint="음식명 입력"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.262"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="나라명"
android:textColor="#000000"
android:textSize="20dp"
app:layout_constraintBottom_toTopOf="@+id/country"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.051"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name"
app:layout_constraintVertical_bias="1.0" />
<EditText
android:id="@+id/country"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:ems="10"
android:hint="음식의 나라명 입력"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.262"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name" />
</androidx.constraintlayout.widget.ConstraintLayout>
1. hint
android:hint="음식명 입력"
입력칸에 쓰여있는 문자를 지정하고 입력칸을 클릭하면 문자가 없어지도록 한다.
<activity_main.java>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="나라별 음식"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ListView
android:id="@+id/listView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:id="@+id/bnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:onClick="onClick"
android:text="음식추가"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
'📱Application > Android' 카테고리의 다른 글
사용자 인터페이스02 - 어댑터뷰(Adapter View) (0) | 2022.05.27 |
---|---|
사용자 인터페이스01 - 메뉴(Menu) (0) | 2022.05.27 |
인터페이스 기초03 - 커스텀뷰(Custom View) (0) | 2022.04.25 |
인터페이스 기초02 - 레이아웃(Layout) (0) | 2022.04.25 |
인터페이스 기초 01 - 뷰(View) (1) | 2022.04.24 |