처음부터 차근차근

팝업 메뉴 본문

프로그래밍/Android

팝업 메뉴

_soyoung 2022. 4. 19. 09:01
반응형

팝업 메뉴

뷰에 부착된 모달 메뉴(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