투케이2K

17. (AndroidStudio/android/java) PopupMenu 객체 사용해서 버튼 클릭 시 팝업 메뉴 호출 실시 본문

Android

17. (AndroidStudio/android/java) PopupMenu 객체 사용해서 버튼 클릭 시 팝업 메뉴 호출 실시

투케이2K 2021. 1. 22. 10:50

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

 

// ==== [전역 변수 선언] ====
String popup_tittle = "";



// ==== [팝업 메뉴 호출 이벤트] ====
button.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		/**
		 * 1. new PopupMenu(현재 클래스, 부모 컴포넌트 클릭 이벤트 값);
		 *    [부모 public void onClick(View v) - v 제어권자 사용]
		 */
		PopupMenu poup = null;
		if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
			//poup = new PopupMenu(A_Main.this, v,  Gravity.END, 0, R.style.popup_style_right_over); //TODO 우측 [겹침] 표시됨
			//poup = new PopupMenu(A_Main.this, v,  Gravity.END, 0, R.style.popup_style_right_top); //TODO 우측 [위에] 표시됨
			//poup = new PopupMenu(A_Main.this, v,  Gravity.END, 0, R.style.popup_style_right_end); //TODO 우측 [아래에] 표시됨

			//poup = new PopupMenu(A_Main.this, v,  Gravity.TOP, 0, R.style.popup_style_left_over); //TODO 좌측 [겹침] 표시됨
			//poup = new PopupMenu(A_Main.this, v,  Gravity.TOP, 0, R.style.popup_style_left_top); //TODO 좌측 [위에] 표시됨
			//poup = new PopupMenu(A_Main.this, v,  Gravity.TOP, 0, R.style.popup_style_left_end); //TODO 좌측 [아래에] 표시됨

			poup = new PopupMenu(A_Main.this, v); //TODO 일반 사용
		}
		else {
			poup = new PopupMenu(A_Main.this, v); //TODO 일반 사용
		}
		getMenuInflater().inflate(R.menu.popup_menu, poup.getMenu());
		poup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
			@Override
			public boolean onMenuItemClick(MenuItem item) {
				Toast.makeText(getApplicationContext(), item.getTitle().toString(), Toast.LENGTH_SHORT).show();
				popup_tittle = item.getTitle().toString();
				//TODO ==== [메뉴 선택 동작 처리] ====
				if(popup_tittle.contains("블루투스")){
					Intent intent= new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
					intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
					startActivity(intent);
					overridePendingTransition(0,0);
				}
				else if(popup_tittle.contains("와이파이")){
					Intent intent= new Intent(Settings.ACTION_WIFI_SETTINGS);
					intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
					startActivity(intent);
					overridePendingTransition(0,0);
				}
				else if(popup_tittle.contains("앱정보")){
					Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
					intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
					Uri uri = Uri.fromParts("package", getPackageName(), null);
					intent.setData(uri);
					startActivity(intent);
					overridePendingTransition(0,0);
					}
				return false;
			}
		});
		poup.show(); // 메뉴를 띄우기
	}
});




// ==== [popup_menu.xml] ====
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:title="설정" >
        <menu>
            <item android:title="블루투스"/>
            <item android:title="와이파이"/>
        </menu>
    </item>

    <item
        android:title="앱정보" />
</menu>



// ==== [styles.xml] ====
<resources>
    <!-- 기본 애플리케이션 액션바 표시 여부를 설정한다 -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <!-- 애플리케이션 기본 색상 지정 -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <!-- 팝업 메뉴창 위치 조절 -->
    <style name="popup_style_right_over" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <item name="android:dropDownHorizontalOffset">-8dp</item>
        <item name="android:dropDownVerticalOffset">8dp</item>
    </style>

    <style name="popup_style_right_top" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <item name="android:dropDownHorizontalOffset">-8dp</item>
        <item name="android:dropDownVerticalOffset">-100dp</item>
    </style>

    <style name="popup_style_right_end" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <item name="android:dropDownHorizontalOffset">-8dp</item>
        <item name="android:dropDownVerticalOffset">150dp</item>
    </style>

    <style name="popup_style_left_over" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <item name="android:dropDownHorizontalOffset">8dp</item>
        <item name="android:dropDownVerticalOffset">8dp</item>
    </style>

    <style name="popup_style_left_top" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <item name="android:dropDownHorizontalOffset">8dp</item>
        <item name="android:dropDownVerticalOffset">-100dp</item>
    </style>

    <style name="popup_style_left_end" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <item name="android:dropDownHorizontalOffset">8dp</item>
        <item name="android:dropDownVerticalOffset">150dp</item>
    </style>

</resources>

/* =========================== */

[결과 출력]

/* =========================== */

/* =========================== */

[요약 설명]

* 1. new PopupMenu(현재 클래스, 부모 컴포넌트 클릭 이벤트 값);

[부모 public void onClick(View v) - v 제어권자 사용]

/* =========================== */

반응형
Comments