Search code examples
javaandroidandroid-buttononitemclicklistenerpopupmenu

click on a button, a popup menu will start, and then I click on a popup menu item then selected item will show on buttontext in android studio


I want to click a button then a popup menu will start and then I click on a popup menu item then the popup menu item will show in button as button text. Suppose there was a button and the button text is "YourEmail". Then I click on the button, and a popup menu will start, when I click on a popup menu item, this item will show on the button as button text.

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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"
    tools:context="com.example.application.popupproject.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="showPopup"
        android:text="show popup"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

MainActivity.java, here I want to show item menu in button as button text:

package com.example.application.popupproject;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.PopupMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.popup_menu);
        popup.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1:
                Toast.makeText(this, "Item 1 clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.item2:
                Toast.makeText(this, "Item 2 clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.item3:
                Toast.makeText(this, "Item 3 clicked", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.item4:
                Toast.makeText(this, "Item 4 clicked", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return false;
        }
    }
}

Solution

  • At first add a button id , then create a button object and link it to the button in the activity_main.xml.

    activity_main.xml

     <?xml version="1.0" encoding="utf-8"?>
     <android.support.constraint.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" tools:context="com.example.application.popupproject.MainActivity">
    
       <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1":
        android:onClick="showPopup"
        android:text="show popup"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
       </android.support.constraint.ConstraintLayout>
    

    MainActivity.java

      package com.example.application.popupproject;
    
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.support.v7.widget.PopupMenu;
      import android.view.MenuItem;
      import android.view.View;
      import android.widget.Toast;
    
      public class MainActivity extends AppCompatActivity implements 
      PopupMenu.OnMenuItemClickListener {
          Button button;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          button = (Button) findViewById(R.id.button1);
          }
    
         public void showPopup(View v) {
         PopupMenu popup = new PopupMenu(this, v);
         popup.setOnMenuItemClickListener(this);
         popup.inflate(R.menu.popup_menu);
         popup.show();
         }
    
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                 case R.id.item1:
                         Toast.makeText(this, "Item 1 clicked", 
                                         Toast.LENGTH_SHORT).show();
                         button.setText("item 1");
                         return true;
                  case R.id.item2:
                          Toast.makeText(this, "Item 2 clicked", 
                                          Toast.LENGTH_SHORT).show();
                           button.setText("item2");
                         return true;
                 case R.id.item3:
                         Toast.makeText(this, "Item 3 clicked", 
                                         Toast.LENGTH_SHORT).show();
                          button.setText("item3");
                           return true;
                 case R.id.item4:
                         Toast.makeText(this, "Item 4 clicked", 
                                     Toast.LENGTH_SHORT).show();
                          button.setText("item4")
                         return true;
                  default:
                        return false;
             }
          }
       }