Android कस्टम ड्रॉपडाउन / पॉपअप मेनू


127

मैं एक कस्टम ड्रॉपडाउन / पॉपअप मेनू को एक बटन के लिए कैसे करूं?

मुझे पॉपअप मेनू की तरह काम करना चाहिए (एक दृश्य के लिए लंगर डालना), और जब मैं मेनू से किसी आइटम पर क्लिक करता हूं तो कुछ करना चाहिए।

मैं कोड द्वारा मेनू में आइटम कैसे जोड़ूं, मेनू की ऊंचाई को ध्यान में रखते हुए और 5 से अधिक आइटम होने पर इसे स्क्रॉल करने योग्य बना सकता हूं। मुझे किसी भी चित्र को जोड़ने की जरूरत नहीं है, बस पाठ।

यहाँ छवि विवरण दर्ज करें

जवाबों:


315

अपडेट : कोटलिन के साथ एंड्रॉइड में एक पॉपअप मेनू बनाने के लिए यहां मेरा जवाब देखें ।

जावा के साथ Android में एक पॉपअप मेनू बनाने के लिए:

निर्देशिका के activity_main.xmlतहत एक लेआउट फ़ाइल बनाएं res/layoutजिसमें केवल एक बटन हो।

फ़ाइल का नाम: activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:paddingBottom="@dimen/activity_vertical_margin"  
    android:paddingLeft="@dimen/activity_horizontal_margin"  
    android:paddingRight="@dimen/activity_horizontal_margin"  
    android:paddingTop="@dimen/activity_vertical_margin"  
    tools:context=".MainActivity" >  

    <Button  
        android:id="@+id/button1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true"  
        android:layout_marginLeft="62dp"  
        android:layout_marginTop="50dp"  
        android:text="Show Popup" />  

</RelativeLayout>  

निर्देशिका के popup_menu.xmlतहत एक फ़ाइल बनाएँres/menu

इसमें तीन आइटम शामिल हैं जैसा कि नीचे दिखाया गया है।

फ़ाइल का नाम: poupup_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >  

    <item  
        android:id="@+id/one"  
        android:title="One"/>  

    <item  
        android:id="@+id/two"  
        android:title="Two"/>  

    <item  
        android:id="@+id/three"  
        android:title="Three"/>  

</menu>  

MainActivity class जो बटन क्लिक पर पॉपअप मेनू प्रदर्शित करता है।

फ़ाइल का नाम: MainActivity.java

public class MainActivity extends Activity {  
    private Button button1;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //Creating the instance of PopupMenu
                PopupMenu popup = new PopupMenu(MainActivity.this, button1);
                //Inflating the Popup using xml file
                popup.getMenuInflater()
                    .inflate(R.menu.popup_menu, popup.getMenu());

                //registering popup with OnMenuItemClickListener
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(
                            MainActivity.this,
                            "You Clicked : " + item.getTitle(),
                            Toast.LENGTH_SHORT
                        ).show();
                        return true;
                    }
                });

                popup.show(); //showing popup menu
            }
        }); //closing the setOnClickListener method
    }
}

प्रोग्राम जोड़ने के लिए:

PopupMenu menu = new PopupMenu(this, view);

menu.getMenu().add("One");
menu.getMenu().add("Two");
menu.getMenu().add("Three");

menu.show();

प्रोग्राम बनाने के लिए इस लिंक का अनुसरण करें


अरे शुक्रिया !! क्या होगा अगर मैं मेनू में और आइटम जोड़ना चाहता हूँ ?. क्या मैं कोड के द्वारा ऐसा कर सकता हूँ?
छंद

आपका स्वागत है .. हाँ आप popup_menu.xml में अधिक आइटम जोड़ सकते हैं
Shylendra Madda

3
ठीक है मुझे पता चला कि आइटम कैसे जोड़ें: menu.getMenu () जोड़ें ("आइटम"); लेकिन मैं मेनू को कैसे कस्टमाइज़ कर सकता हूं?
२०

1
अब इसे v7 कंपेटिवर्स सपोर्ट लाइब्रेरी के जरिए 3.0 (हनीकॉम्ब) से नीचे के वर्जन में भी इस्तेमाल किया जा सकता है ..
AndroidMech

1
<आइटम Android: id = "@ id / google_plus" Android: title = "@ string / menu_google_plus" Android: icon = "@ drawable / add_by_gp" Android: showAsAction = "ifRoom। withText" /> यह है कि मैंने कैसे जोड़ा है | लेकिन मैं पाठ के साथ छवि नहीं देख सकता
श्री

8

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मुझे एक और उत्तर मिला है जो मेरे लिए बेहतर काम करता है और यह किसी भी उत्तर में प्रकट नहीं होता है।

एक लेआउट बनाएँ xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dip"
    android:paddingBottom="5dip"
    android:paddingStart="10dip"
    android:paddingEnd="10dip">

<ImageView
    android:id="@+id/shoe_select_icon"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_gravity="center_vertical"
    android:scaleType="fitXY" />

<TextView
    android:id="@+id/shoe_select_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textSize="20sp"
    android:paddingStart="10dp"
    android:paddingEnd="10dp"/>

</LinearLayout>

एक ListPopupWindow और सामग्री के साथ एक नक्शा बनाएँ:

ListPopupWindow popupWindow;
List<HashMap<String, Object>> data = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
    map.put(TITLE, getString(R.string.left));
    map.put(ICON, R.drawable.left);
    data.add(map);
    map = new HashMap<>();
    map.put(TITLE, getString(R.string.right));
    map.put(ICON, R.drawable.right);
    data.add(map);

फिर क्लिक करने पर, इस फ़ंक्शन का उपयोग करके मेनू प्रदर्शित करें:

private void showListMenu(final View anchor) {
    popupWindow = new ListPopupWindow(this);

    ListAdapter adapter = new SimpleAdapter(
            this,
            data,
            R.layout.shoe_select,
            new String[] {TITLE, ICON}, // These are just the keys that the data uses (constant strings)
            new int[] {R.id.shoe_select_text, R.id.shoe_select_icon}); // The view ids to map the data to

    popupWindow.setAnchorView(anchor);
    popupWindow.setAdapter(adapter);
    popupWindow.setWidth(400);
    popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch (position){
                case 0:
                    devicesAdapter.setSelectedLeftPosition(devicesList.getChildAdapterPosition(anchor));
                    break;
                case 1:
                    devicesAdapter.setSelectedRightPosition(devicesList.getChildAdapterPosition(anchor));
                    break;
                default:
                    break;
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    devicesAdapter.notifyDataSetChanged();
                }
            });
            popupWindow.dismiss();
        }
    });
    popupWindow.show();
}

6

द कोटलिन वे

fun showPopupMenu(view: View) {
    PopupMenu(view.context, view).apply {
                menuInflater.inflate(R.menu.popup_men, menu)
                setOnMenuItemClickListener { item ->
                    Toast.makeText(view.context, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show()
                    true
                }
            }.show()
}

अद्यतन: उपरोक्त कोड में, लागू फ़ंक्शन रिटर्न की thisआवश्यकता नहीं है, इसलिए हम उपयोग कर सकते हैं runजो कुछ भी नहीं लौटाता है और इसे और भी सरल बनाने के लिए हम शोपॉपमेन विधि के घुंघराले ब्रेसिज़ को भी हटा सकते हैं।

यहां तक ​​कि सरल:

fun showPopupMenu(view: View) = PopupMenu(view.context, view).run {
            menuInflater.inflate(R.menu.popup_men, menu)
            setOnMenuItemClickListener { item ->
                Toast.makeText(view.context, "You Clicked : ${item.title}", Toast.LENGTH_SHORT).show()
                true
            }
            show()
        }

3

सबसे पहले, "res" फ़ोल्डर में "मेनू" नामक एक फ़ोल्डर बनाएं।

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="Search"/>
    <item
        android:id="@+id/add"
        android:icon="@android:drawable/ic_menu_add"
        android:title="Add"/>
    <item
        android:id="@+id/edit"
        android:icon="@android:drawable/ic_menu_edit"
        android:title="Edit">
        <menu>
            <item
                android:id="@+id/share"
                android:icon="@android:drawable/ic_menu_share"
                android:title="Share"/>
        </menu>
    </item>

</menu>

फिर, अपनी गतिविधि कक्षा बनाएँ:

public class PopupMenu1 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.popup_menu_1);
    }

    public void onPopupButtonClick(View button) {
        PopupMenu popup = new PopupMenu(this, button);
        popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu());

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(PopupMenu1.this,
                        "Clicked popup menu item " + item.getTitle(),
                        Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        popup.show();
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.