मैं इस गाइड का अनुसरण कर रहा हूं और डेमो के अंत तक काम करने का उदाहरण है (बहुत ही व्यावहारिक ट्यूटोरियल, 10/10 सिफारिश करेगा):

https://codenameone.teachable.com/courses/java-for-mobile-devices-introducing-codename-one/lectures/2647773

अब मैं नए आइटम जोड़ने के लिए फ़्लोटिंग एक्शन बटन जोड़कर इसे और अधिक व्यावहारिक टूडू सूची में विस्तारित करना चाहता था, जैसे:

fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT,
Component.BOTTOM);
fab.addActionListener(e -> { // show dialog for adding new item });

यह अपने आप ठीक काम करता है। मुश्किल हिस्सा यहां से शुरू होता है। किसी भी आइटम पर लॉन्ग प्रेस इवेंट का उपयोग करते समय, दो चीजें होनी चाहिए:

  1. लंबे समय तक दबाए गए आइटम का दृश्य यह इंगित करने के लिए बदलना चाहिए कि इसे चुना जा रहा है (चेकबॉक्स या टॉगल बटन के संदर्भ में नहीं बल्कि एक हाइलाइट।
  2. हाइलाइट किए गए आइटम को हटाने के लिए FAB को अपना आइकन और एक्शनलिस्टर बदलना चाहिए।

लंबी प्रेस घटना चेकबॉक्स वर्ग से longPointPress विधि को ओवरराइड करने में हासिल की जाती है:

@Override
public void longPointerPress(int x, int y){
     mainForm.longPressEvent(this);
    // no event parameter for e.consume();
}

मेरे सवालों के लिए:

Q1: जब मैं टॉगलबटन से एक्शन श्रोता का उपयोग करता हूं, तो "सामान्य" क्लिक इवेंट और साथ ही लॉन्ग प्रेस इवेंट दोनों को निकाल दिया जाता है। हालांकि मुझे दोनों के बीच अंतर करने की जरूरत है। longPointerPress विधि में परम सूची में ईवेंट नहीं है, इसलिए मैं अपनी लंबी प्रेस इवेंट गतिविधि के बाद ईवेंट का उपभोग नहीं कर सकता। मैं सामान्य क्रिया श्रोता को फायरिंग से कैसे रोक सकता हूं?

Q2: "हाइलाइट इफेक्ट" के लिए, मैं चाहता हूं कि आइटम में सभी तरफ मार्जिन हो, कुल मिलाकर उस राशि से तत्व को सिकोड़ें। दूसरे शब्दों में, पिछले कुल आकार को बढ़ाए बिना। हालांकि केवल एक मार्जिन जोड़कर, आइटम बड़ा हो जाता है। किसी दिए गए तत्व को सभी तरफ से मार्जिन के साथ कैसे सिकोड़ सकता है, लेकिन मूल आकार को संरक्षित कर सकता है?

Q3: एक FAB के पास केवल "setIcon" का विकल्प होता है, "setMaterialIcon" का नहीं। इसलिए, मैं वर्तमान में एफएबी को हर बार बदलने पर फिर से बना रहा हूं, क्योंकि मैं इसमें शामिल शैलियों के साथ हलचल नहीं करना चाहता। क्या इससे बेहतर कोई तरीका है?

//this is the unwanted function, as I dont want to set the style myself
fab.setIcon(FontImage.createMaterial(icon, s));

//Delete FAB pressed, change to Add FAB
fab.remove();
fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT, Component.BOTTOM);
1
Lequi 3 पद 2018, 00:17

1 उत्तर

सबसे बढ़िया उत्तर

एक्शन इवेंट को हमेशा पॉइंटर रिलीज़ पर लागू किया जाता है, भले ही एक लंबी प्रेस घटना को निकाल दिया गया हो, क्योंकि हम नहीं जानते कि आपने लॉन्गप्रेस इवेंट को संसाधित किया है। आपको एक ध्वज बनाने की आवश्यकता होगी जैसे:

private boolean handledInLongPress;

public void longPress(int x, int y) {
   // do your stuff
   handledInLongPress = true;
}


private void handleActionEvent(ActionEvent ev) {
    // I'm using this as a placeholder for your event code
    // block the event from propagating and undo anything it might
    // have triggered
    ev.consume();
}

मैं तत्वों पर setUIID() का उपयोग करने की अनुशंसा करता हूं और UIID के "हटाएं*" सेट को परिभाषित करता हूं। सिकुड़ने का प्रभाव पैदा करने के लिए आप छोटे पैडिंग और फोंट को परिभाषित कर सकते हैं लेकिन अगर आपके यहां आइकन भी हैं तो यह मुश्किल हो सकता है। आप उक्त चिह्नों को छोटा कर सकते हैं और मूल को क्लाइंट संपत्ति में पुनर्स्थापित करने के लिए रख सकते हैं।

एफएबी बहुत सी धारणाएं बनाता है इसलिए इसे फिर से बनाना (या दो उदाहरणों का उपयोग करना) शायद आइकन सेट करने की कोशिश करने से बेहतर तरीका है। वर्तमान कार्यान्वयन में रनटाइम पर FAB के चिह्न को बदलने का कोई तरीका नहीं है।

1
Shai Almog 3 पद 2018, 05:08