2015-12-24 13 views
10

के साथ पॉप अप मेनू लागू करें मैं डिफ़ॉल्ट पॉप मेनू का उपयोग कर रहा हूं और इसके व्यवहार की अपेक्षा कर रहा हूं। सब कुछ ठीक काम कर रहा है। पॉप अप मेनू के प्रतिपादन के संबंध में मेरी चिंता क्या है। मेरा पॉप अप मेनू स्क्रीन के दाईं ओर चिपक जाता है।मार्जिन

मैं एंड्रॉइड के लिए यूट्यूब ऐप द्वारा उपयोग किए जाने वाले व्यवहार को चाहता हूं। enter image description here

मैं मुख्य रूप से अपने पॉप अप मेनू में सही मार्जिन प्रदान करने में सक्षम नहीं हूं। कृपया मदद करे। मैंने पॉपअप मेनू में गुरुत्वाकर्षण प्रदान करने का प्रयास किया है। लेकिन पॉप अप मेनू स्क्रीन के दाईं ओर चिपक जाता है।

PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT); 


     popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu()); 
+0

असल में, यह स्क्रीन करने के लिए सही करने के लिए स्थिर नहीं बनी रहती है, लेकिन यह आप लंगर के रूप में निर्माता में सेट लंगर देखें करने के लिए लाठी। मुझे नहीं पता कि कैसे यूट्यूब पॉपअपमेनस प्रस्तुत करता है, लेकिन आप एक अलग एंकर का उपयोग करने का प्रयास कर सकते हैं, i.E. अपने पॉपअपमेनू को जोड़ने के उद्देश्य के लिए केवल एक अदृश्य दृश्य स्थापित करना। –

+0

मैंने कोशिश की। लेकिन फिर भी यह दाईं ओर चिपक जाता है। मैंने फर्जी एंकर व्यू बनाने की कोशिश की है लेकिन फिर भी व्यवहार समान है। –

+0

ओह, आप सही हैं, मैंने अभी पुष्टि की है। सुनिश्चित नहीं है कि यूट्यूब ऐसा करता है, लेकिन मैं 'पॉपअपमेनू' के बजाय 'पॉपअपविंडो' का उपयोग करने का प्रयास करने का सुझाव दूंगा। 'पॉपअपविंडो' को देखने के लिए और अधिक अच्छी तरह से लगाया गया है, लेकिन आपको इसे अपने आप से बाहर रखना होगा –

उत्तर

1

आप विशेष स्थान

popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0); 

public void showAtLocation(View parent, int gravity, int x, int y) { 
     showAtLocation(parent.getWindowToken(), gravity, x, y); 
    } 

पर popUpWindow सेट कर सकते हैं आप तो आप कोशिश कर सकते हैं

public void showAsDropDown(View anchor, int xoff, int yoff) { 
     showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY); 
    } 

PopupWindow http://developer.android.com/intl/es/reference/android/widget/PopupWindow.html

का प्रलेखन पर एक नज़र डालें लटकती के रूप में यह दिखाना चाहते हैं
20

आप अपना पॉपअपमेनू बदल सकते हैं ' निम्न विशेषताओं का उपयोग करके स्थिति: गुरुत्वाकर्षण, dropDownHorizontalOffset और dropDownVerticalOffset

Gravity.END

को पहले सेट गुरुत्वाकर्षण
popup.setGravity(Gravity.END); 

फिर एक शैली

बनाकर अपने लटकती-ऑफसेट बदल
<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu"> 
    <item name="android:dropDownHorizontalOffset">-4dp</item> 
    <item name="android:dropDownVerticalOffset">4dp</item> 
</style> 

यदि आप एंकर दृश्य को ओवरलैप करना चाहते हैं का उपयोग

parent="@style/Widget.AppCompat.PopupMenu.Overflow" 

अन्त में अपने विषय

<item name="popupMenuStyle">@style/MyPopupMenu</item> 
+0

धन्यवाद, गुरुत्वाकर्षण को गुरुत्वाकर्षण स्थापित करना। मेरे लिए चाल है। डिफ़ॉल्ट NO_GRAVITY मान इसके एंकर के साथ संरेखण को अनदेखा करने के लिए प्रतीत होता है। – somedev

+0

अगर हम इसे लागू करते हैं तो वास्तव में अच्छी तरह से काम करता है। अच्छा – saksham

+0

आंशिक रूप से काम करता है। 1. मेरी थीम में मुझे ' ... ',' एंड्रॉइड के बिना:' नेमस्पेस ने मेनू शैली को लागू नहीं किया था। 2. यह मूल शैली लागू करता है, लेकिन ऑफ़सेट सुधार का कोई प्रभाव नहीं पड़ता है। – quezak

2

यह एक छोटे से देर हो चुकी है, लेकिन मुझे उम्मीद है कि इस मदद करता है किसी को MyPopupMenu लागू होते हैं।

मैं PopupMenu के साथ जो कर रहा था वह करने की कोशिश कर रहा था, लेकिन जब तक मैंने ListPopupWindow के बारे में सीखा, तब तक मेरे लिए कुछ भी काम नहीं कर रहा था। यह एक बेहतर विकल्प है। मेरी राय में अधिक लचीलापन और आप जिस मार्जिन-स्पेसिंग के बारे में पूछ रहे थे उसे प्राप्त कर सकते हैं।

public class MainActivity extends AppCompatActivity 
{ 
    private ImageButton mMoreOptionsButton; 
    private ArrayAdapter<String> mPopupAdapter; 
    private ArrayList<String> mOptionsArray = 
      new ArrayList<>(Arrays.asList("Option1", "Option2", "Option3")); 
    private ListPopupWindow mPopupWindow; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mMoreOptionsButton = (ImageButton) view.findViewById(R.id.more_options_button); 
     setupPopupWindow(); 
    } 

    private void setupPopupWindow() 
    { 
     mPopupAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, mOptionsArray); 
     mPopupWindow = new ListPopupWindow(MainActivity.this); 
     mPopupWindow.setAdapter(mPopupAdapter); 
     mPopupWindow.setAnchorView(mMoreOptionsButton); 
     mPopupWindow.setWidth(500); 
     mPopupWindow.setHorizontalOffset(-380); //<--this provides the margin you need 
     //if you need a custom background color for the popup window, use this line: 
     mPopupWindow.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.gray))); 

     mPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       //do something with item by referring to it using the "position" parameter 
      } 
     }); 

     mMoreOptionsButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       mPopupWindow.show(); 
      } 
     }); 
    } 
} 

महत्वपूर्ण हिस्सा mPopupWindow.setHorizontalOffset() बुला रहा है:

कोड यह रहा। ध्यान रखें कि यह विधि मुश्किल है। mPopupWindow.setWidth() में सेट किए गए मान के आधार पर आपको तदनुसार setHorizontalOffset() में मान समायोजित करना होगा। ऐसा ही हुआ कि मेरे ऐप के लिए, -380 अंत से आवश्यक मार्जिन की सही मात्रा थी। तो आपको इस मूल्य के साथ थोड़ा सा खेलना पड़ सकता है।

मुझे विश्वास है कि setHeight() और setVerticalOffset() का उपयोग करने के लिए कहा जा सकता है यदि आप अपनी पॉपअप विंडो के शीर्ष पर कुछ मार्जिन चाहते हैं।

आशा इस मदद करता है:]

संबंधित मुद्दे