2015-11-27 8 views
14

क्लिक मैं ActionBar में एक मेनू जो मैं के माध्यम से बनाने के है:एस्प्रेसो मेनू आइटम

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    menu.add(Menu.NONE, 98,Menu.NONE,R.string.filter).setIcon(R.drawable.ic_filter_list_white_48dp).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    menu.add(Menu.NONE, 99,Menu.NONE,R.string.add).setIcon(R.drawable.ic_add_white_48dp).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 


    getMenuInflater().inflate(R.menu.menu_main, menu); 

    return true; 
} 

और menu_main.xml की तरह दिखता है:

<menu 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" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_settings" 
     android:title="@string/action_settings" 
     android:orderInCategory="100" 
     app:showAsAction="never" 
     android:icon="@drawable/ic_settings_white_48dp"/> 
</menu> 

जब एस्प्रेसो में परीक्षण मैं पर क्लिक करें चाहते हैं "एड" आइकन (मेनू आईडी 99)। मैंने

@Test 
public void testAdd() { 
openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); 
    onView(withText(R.string.add)).perform(click()); 
} 

लेकिन यह NoMatchingViewException के साथ विफल रहता है। (सेटिंग आइटम, जिसे सीधे एक्सएमएल में परिभाषित किया गया है, मैं उसी कोड के साथ क्लिक कर सकता हूं।)

यह लक्ष्य एसडीकेवर्सन 23 और ऐप कॉम्पैक्टएक्टिविटी के लिए है। उपकरण पट्टी के लिए प्रासंगिक पंक्तियां हैं:

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar); 
setSupportActionBar(toolbar); 
if(getSupportActionBar() != null) { 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

और tool_bar.xml की तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar  xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark" 
    android:background="@color/ColorPrimary" 
    android:elevation="4dp" 
    tools:ignore="UnusedAttribute"> 
</android.support.v7.widget.Toolbar> 
+0

क्या 'targetSdkVersion', ActionBar और डिवाइस/एम्युलेटर प्रयोग कर रहे हैं ?. OpenActionBarOverflowOrOptionsMenu() कार्यान्वयन (एस्प्रेसो क्लास) देखें, इन कारकों पर निर्भर करता है। मुझे इसकी जांच करने की ज़रूरत है लेकिन मेरे द्वारा उपयोग किए जाने वाले एमुलेटर के आधार पर कुछ गड़बड़ है। – albodelu

+0

targetSdkVersion 23 और AppCompatActivity। मैंने उपरोक्त टूलबार कोड जोड़ा। – user1583209

+0

"withText (R.string.add)" के साथ पाठ मिलान करते समय कोई समस्या हो सकती है, क्योंकि वास्तविक पाठ दिखाई नहीं दे रहा है, लेकिन केवल आइकन (R.drawable.ic_add_white_48dp) दिखाई दे रहा है? – user1583209

उत्तर

23

अद्यतन: मैं रेखा के अंतिम नहीं देखा था, मेरे पिछले प्रतिक्रियाओं पर ध्यान न दें, मैंने इसे ठीक करने की कोशिश की और मैंने गलत किया। मुझे वास्तव में जवाब नहीं पता था।

मिलान दिखाई प्रतीक:: अतिप्रवाह मेनू में आइटमों पर

// Click on the icon - we can find it by the r.Id. 
    onView(withId(R.id.action_save)) 
    .perform(click()); 

क्लिक करने के लिए थोड़ा जटिल काम है

...setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) 

आपका प्रश्न एस्प्रेसो टीम द्वारा here समझाया गया है सामान्य क्रिया बार के रूप में कुछ उपकरणों में हार्डवेयर ओवरफ़्लो मेनू बटन 01 होता है(वे एक विकल्प मेनू में बहती हुई वस्तुओं को खोलेंगे) और कुछ डिवाइसों में एक सॉफ्टवेयर ओवरफ़्लो मेनू बटन होता है (वे एक सामान्य ओवरफ़्लो मेनू खोलेंगे)। सौभाग्य से, एस्प्रेसो हमारे लिए यह संभालती है।

// Open the overflow menu OR open the options menu, 
    // depending on if the device has a hardware or software overflow menu button. 
    openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); 

    // Click the item. 
    onView(withText("World")) 
    .perform(click()); 

तो मैं समझता हूँ कि दोनों विकल्प सही हैं लेकिन अपने विशिष्ट मामले पर निर्भर हैं। यदि आप एक बटन का परीक्षण करते हैं तो आप आमतौर पर जानते हैं कि यह उस समय दिखाई दे रहा है या नहीं।

आपके मामले में बटन दिखाई दे रहा है क्योंकि वहाँ कक्ष है, और यह withIdhere की तरह उपयोग करने के लिए सही है:

import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; 

@Test 
public void testClickInsertItem() { 
    openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); 
    onView(withId(R.id.action_insert)).perform(click()); 
} 

लेकिन this यह अतिप्रवाह मदों के लिए भी सही है:

हाँ, यह यह एस्प्रेसो में कैसे काम करता है। यहां समस्या यह है कि एंड्रॉइड में, मेनू आइटम का प्रतिनिधित्व करने वाला दृश्य मेनू आइटम मेनू आइटम नहीं है। तो ऑन व्यू (withId (X)) बस एक दृश्य खोजने में विफल रहता है। मैं के साथ केवल Text() का उपयोग करने की तुलना में बेहतर अनुशंसा नहीं करता हूं। यदि आपके पास एक ही पाठ के साथ कई दृश्य हैं, तो भेदभाव कार्यों के लिए पदानुक्रम का उपयोग करते हुए।

अब मेरे सवाल है जब आप विभिन्न उपकरणों पर परीक्षण करने और आप नहीं जानते कि जब एक आइटम के लिए जगह नहीं होगी क्या करना है। मुझे प्रतिक्रिया नहीं पता, शायद दोनों समाधानों को गठबंधन करें।

+0

धन्यवाद। तो "withText()" का उपयोग कर दृश्यमान आइकन से मिलान करना संभव नहीं है? यदि संभव हो तो मैं जितना संभव हो सके "withId()" का उपयोग करना टालना चाहूंगा, क्योंकि मेरी समझ में परीक्षण को उपयोगकर्ता क्रियाओं का अनुकरण करना चाहिए और मनुष्य एक (अदृश्य) आईडी के बजाय टेक्स्ट/आइकन की तलाश करेंगे। – user1583209

+0

मुझे नहीं पता, बेहतर प्रतिक्रिया की प्रतीक्षा करें, मैंने जवाब दिया क्योंकि मैंने सोचा था कि यह वही मुद्दा था जिस पर मैंने आपको टिप्पणी की थी। यदि कोई जवाब नहीं देता है और मुझे बेहतर प्रतिक्रिया मिलती है तो मैं इसे अपडेट कर दूंगा। मैंने कभी भी SHOW_AS_ACTION_IF_ROOM का उपयोग नहीं किया और मैं अभी भी एस्प्रेसो सीख रहा हूं। – albodelu

0

उपकरण पट्टी ActionBar, कॉल करने की कोई जरूरत नहीं है:

openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); 

और यदि आप इसे करते हैं, कि सुनिश्चित करें कि आपके आइटम वहाँ नहीं मिलेगा (यह ActionBar में नहीं है) और टूलबार की "सामान्य दृश्य" से संबंधित है।

2

आप मेनू आइटम पर क्लिक करने के लिए इस विधि का उपयोग कर सकते हैं। इस कोड को

openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); 

तो क्लिक मेनू "MenuItemName" के साथ text.Replace के आधार पर अपने मेनू आइटम नाम आइटम प्रदर्शन

onView(withText("MenuItemName")).perform(click()); 
1
Espresso.openContextualActionModeOverflowMenu() 

ही एकमात्र विकल्प है कि के लिए काम किया था का उपयोग कर प्रथम क्लिक मेनू बटन मेरी सैमसंग नोट 3. यह openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); किसी भी त्रुटि के बिना कोशिश करेगा और असफल होगा

0

यह मेरा समाधान है जो सभी तीन स्थितियों को कवर करता है: हार्डवेयर मेनू बटन, ओवरफ़्लो मी enu, केवल माउस:

try { 
     openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); 
    } catch (Exception e) { 
     //This is normal. Maybe we dont have overflow menu. 
    } 
    onView(anyOf(withText(R.string.<your label for the menu item>), withId(R.id.<id of the menu item>))).perform(click()); 
1

उपयोग इस मेनू आइटम के लिए विवरण पाठ पर मैच के लिए:

onView(withContentDescription(R.string.add)).perform(click()); 

तो फिर तुम (न के बराबर) आईडी पर मेल करने के लिए की जरूरत नहीं है, और न ही पर खींचने योग्य आइकन।

इसके अलावा, the Espresso documentation से इस कोड का उपयोग करता है, तो आप यकीन है कि मेनू का विस्तार होता है बनाने की जरूरत है याद रखें:

// Open the overflow menu OR open the options menu, 
// depending on if the device has a hardware or software overflow menu button. 
openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); 
0

एक बहुत ग्रस्त नहीं है। चलो इसे सरल बनाएं

onView(withId(98)).perform(click()); 

यह आपको क्लिक प्रदर्शन करने में मदद मिलेगी पर जोड़े

+0

यह मुझे पता है। लेकिन मैं "withText()" से मेल खाना पसंद करूंगा। Albodelu के जवाब पर भी मेरी टिप्पणी देखें। – user1583209

+0

पाठ के साथ इस परिदृश्य के अनुरूप नहीं होगा क्योंकि एस्प्रेसो मूल रूप से स्क्रीन पर दिखाए गए पाठ को ढूंढता है। हालांकि हम आइकन का उपयोग करते हैं जिसमें कोई टेक्स्ट नहीं है। हम पाठ() के साथ कार्रवाई नहीं कर सकते हैं। – Manish

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