처음부터 차근차근
팝업 메뉴 본문
반응형
팝업 메뉴
뷰에 부착된 모달 메뉴(modal menu)를 팝업 메뉴라 한다.
API 레벨 11부터 제공하기 시작했으며 용도는 아래와 같다.
<용도>
- 오버플로우 스타일 메뉴 제공
- 서브 메뉴의 역할
- 드롭다운 메뉴
팝업메뉴 만들기
1. res 아래에 menu 디렉토리 만들기
2. 그 밑에 popup.xml 만들기
popup.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/mnuSearch"
android:icon="@android:drawable/ic_menu_search"
android:title="Search" />
<item
android:id="@+id/mnuAdd"
android:icon="@android:drawable/ic_menu_add"
android:title="Add" />
<item
android:id="@+id/mnuEdit"
android:icon="@android:drawable/ic_menu_edit"
android:title="Edit" >
<menu>
<item
android:id="@+id/mnuShare"
android:icon="@android:drawable/ic_menu_share"
android:title="Share" />
</menu>
</item>
</menu>
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="onClick"
android:text="show popup menu"
/>
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(this, view);
popupMenu.getMenuInflater().inflate(R.menu.popup, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.mnuSearch:
Toast.makeText(MainActivity.this, "Search", Toast.LENGTH_SHORT).show();
return true;
case R.id.mnuAdd:
Toast.makeText(MainActivity.this, "Add", Toast.LENGTH_SHORT).show();
return true;
case R.id.mnuShare:
Toast.makeText(MainActivity.this, "Share", Toast.LENGTH_SHORT).show();
return true;
default:
return true;
}
}
});
popupMenu.show();
}
}
대화상자(dialog)
대화 상자(dialog)는 사용자에게 메시지를 출력하고 사용자로부터 입력을 받아들이는 아주 보편적인 사용자 인터페이스이다.
대화 상자의 종류
1. AlertDialog
2. ProgressDialog
3. DatePickerDialog, TimePickerDialog
AlertDialog 만들기
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("결제처리");
alertDialogBuilder.setMessage("결제하시겠습니까?");
alertDialogBuilder.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, "결제가 완료되었습니다!", Toast.LENGTH_SHORT).show();
}
});
alertDialogBuilder.setNegativeButton("아니오", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, "결제가 취소되었습니다...", Toast.LENGTH_SHORT).show();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="onClick"
android:text="결제하려면 버튼을 클릭하세요" />
</LinearLayout>
DatePickerDialog, TimePickerDialog 만들기
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btnDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="onClick"
android:text="날짜설정" />
<Button
android:id="@+id/btnTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="onClick"
android:text="시간설정" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private Button btnDate, btnTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnDate = (Button) findViewById(R.id.btnDate);
btnTime = (Button) findViewById(R.id.btnTime);
}
public void onClick(View view) {
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Asia/Seoul"), Locale.KOREA);
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
int mHour = c.get(Calendar.HOUR_OF_DAY);
int mMinute = c.get(Calendar.MINUTE);
if (view == btnDate) {
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) { // 연 월 일
btnDate.setText(i + "/" + i1 + "/" + i2);
}
}, mYear, mMonth, mDay);
datePickerDialog.show();
}
else if (view == btnTime) {
TimePickerDialog timePickerDialog = new TimePickerDialog(this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int i, int i1) { // 시간 분
btnTime.setText(i + ":" + i1);
}
}, mHour, mMinute, false); // false : 24시간으로 보지 않음
timePickerDialog.show();
}
}
}
실행결과
ProgressDialog 만들기
1.
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btnProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="자료조회"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("앱의 세계로 온것을 뜨겁게 환영합니다.");
progressDialog.setCancelable(true); // 뒤로가기 가능하게 함(뒤로가기하면 로딩 끝)
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.show();
doInitialTask();
}
private void doInitialTask() {
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
progressDialog.dismiss();
}
};
// Take delay time for 3 seconds.
handler.sendEmptyMessageDelayed(0, 5*1000);
}
}
2.
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btnProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="자료조회"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
BackTask task = new BackTask();
task.execute();
}
private class BackTask extends AsyncTask<Void, Void, Void> {
ProgressDialog asyncDialog = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() { // 1번
asyncDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
asyncDialog.setMessage("로딩중입니다..");
asyncDialog.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) { // 2번
try {
for (int i = 0; i < 6; i++) {
asyncDialog.setProgress(i * 20);
Thread.sleep(3 * 1000);
}
} catch (InterruptedException e) {}
return null;
}
@Override
protected void onPostExecute(Void result) { // 3번
asyncDialog.dismiss();
super.onPostExecute(result);
}
}
}
출처 : 안드로이드프로그래밍(22-1학기)김용남교수 강의 내용 변형 및 요약
반응형
'프로그래밍 > Android' 카테고리의 다른 글
RxJava (0) | 2022.05.08 |
---|---|
Reactive programming(수정) (1) | 2022.04.22 |
Android 메뉴 (0) | 2022.04.12 |
리스너 객체 (2) | 2022.04.08 |
이벤트 처리 (0) | 2022.03.28 |
Comments