2013-12-09 2 views
27

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

अब मुझे एक्सेसिबिलिटी फ़ंक्शन लागू करना चाहिए - पुस्तक को फोन (ऑडियो) द्वारा पढ़ा जाना चाहिए।

मैंने https://developer.android.com/guide/topics/ui/accessibility/index.html पर पहुंच क्षमता अनुभाग पढ़ा है लेकिन यह पर्याप्त स्पष्ट नहीं है।

मैं एक्सेसिबिलिटी प्रबंधन के लिए SupportLibrary का उपयोग करता हूं और अब मेरे पास यह कोड ViewGroup (जो पुस्तक पृष्ठों का प्रबंधन करता है) में है। कोड 1:

@Override 
    public void onInitializeAccessibilityEvent(final View host, final AccessibilityEvent event) { 
     super.onInitializeAccessibilityEvent(host, event); 

     event.setClassName(EditionPageView.class.getName()); 
     if (hasText()) { 
      event.getText().add(getPageRangeText()); 
      final String trimText = mSurfaceUpdateData.getPageText().trim(); 
      if (trimText.length() > MAX_TEXT_LENGTH) { 
       event.getText().add(trimText.substring(0, MAX_TEXT_LENGTH)); 
//    event.getText().add(trimText.substring(MAX_TEXT_LENGTH, trimText.length())); 
      } 
      else { 
       event.getText().add(trimText); 
      } 
     } 
    } 

    @Override 
    public void onInitializeAccessibilityNodeInfo(final View host, final AccessibilityNodeInfoCompat info) { 
     super.onInitializeAccessibilityNodeInfo(host, info); 

     info.setClassName(EditionPageView.class.getName()); 
    } 

क्योंकि पेज पाठ डेटा लोड अतुल्यकालिक पहली बार पहुंच किसी भी पाठ की जरूरत नहीं है, जबकि कार्यान्वित onInitializeAccessibilityEvent कोड:

private class EditionPagesViewSwitcherAccessibilityDelegate extends AccessibilityDelegateCompat { 

    private int mPageCount; 
    private double[] mPageRange; 

    @Override 
    public void onInitializeAccessibilityEvent(final View host, final AccessibilityEvent event) { 
     super.onInitializeAccessibilityEvent(host, event); 
     event.setClassName(EditionPagesViewSwitcher.class.getName()); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
      event.setScrollable(canScroll()); 
     } 
     if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED && updatePageValues()) { 
      event.setItemCount(mPageCount); 
      // we use +1 because of user friendly numbers (from 1 not 0) 
      event.setFromIndex((int) (mPageRange[0] + 1)); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
       event.setToIndex((int) (mPageRange[1] + 1)); 
      } 
     } 
    } 

    @Override 
    public void onInitializeAccessibilityNodeInfo(final View host, final AccessibilityNodeInfoCompat info) { 
     super.onInitializeAccessibilityNodeInfo(host, info); 
     info.setClassName(EditionPagesViewSwitcher.class.getName()); 

     info.setScrollable(canScroll()); 
     info.setLongClickable(true); 
     if (canScrollForward()) { 
      info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD); 
     } 
     if (canScrollBackward()) { 
      info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD); 
     } 
    } 

    @Override 
    public boolean performAccessibilityAction(final View host, final int action, final Bundle args) { 
     if (super.performAccessibilityAction(host, action, args)) { 
      return true; 
     } 
     switch (action) { 
      case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: { 
       if (canScrollForward()) { 
        showNext(); 
        return true; 
       } 
      } 
      return false; 
      case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: { 
       if (canScrollBackward()) { 
        showPrevious(); 
        return true; 
       } 
      } 
      return false; 
     } 
     return false; 
    } 

यहाँ पेज देखने से कोड कोड 2 है। और फिर जब डेटा लोड हो गया है तो मैं एक्सेस एक्सेसिबिलिटी IY.TYPE_VIEW_SELECTED और AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED ईवेंट चलाता हूं। फिर InitializeAccessibilityEvent फिर से निष्पादित करता है और "पाठ" पुस्तक पाठ को फोन करता है।

तो मेरे सवालों का:

  1. मेरी पहुँच क्षमता कार्यान्वयन सही है? क्या यह गलत है? क्योंकि मुझे इस सुविधा के बारे में कोई अच्छा ट्यूटोरियल नहीं मिला।
  2. मुझे कोड 1 में समर्थन कार्यान्वयन में एसडीके संस्करणों की जांच का उपयोग क्यों करना है? कार्यान्वयन का समर्थन क्यों सही ढंग से संभाल नहीं करता है?
  3. फायरिंग TYPE_VIEW_SELECTED और TYPE_VIEW_TEXT_CHANGED वास्तव में आवश्यक है? या हो सकता है कि कुछ अन्य कोड लागू किया जाना चाहिए?
  4. मुख्य प्रश्न। कोड 2 में कोड लाइन पर टिप्पणी की गई है। यह कोड कथन टेक्स्ट को कम करने के बाद MAX_TEXT_LENGTH (यह 3800) कम है क्योंकि यदि टेक्स्ट बड़ा है तो कुछ भी नहीं खेला जाता है। कुछ भी तो नहीं। क्या यह अभिगम्यता प्रतिबंध है? कोई भी अन्य पाठ जो कम है, तो यह मान अच्छी तरह से खेला जाता है।
  5. क्या कोई जानता है कि मुझे कोई अच्छा ट्यूटोरियल कहां मिल सकता है? (हाँ मैंने नमूने देखा)।
  6. क्या किसी के पास देखने के लिए कोई कस्टम प्राप्तियां हैं?

खैर

अपडेट किया गया। यहाँ कुछ जवाब है:

  1. मैं देख सकते हैं TYPE_VIEW_SELECTED और TYPE_VIEW_TEXT_CHANGED घटनाओं की जरूरत नहीं कर रहे हैं आप इस पाठ को जैसे ही आप इसे पाने के रूप में पढ़ा जा करने के लिए नहीं करना चाहते हैं।
  2. नेक्सस 7 पर सभी बड़े टेक्स्ट अच्छी तरह से खेला जाता है (8000 प्रतीकों तक टेक्स्ट), इसलिए यह समस्या इस पर पुन: उत्पन्न नहीं होती है, लेकिन सैमसंग गैलेक्सी टैब 10.1 (एंड्रॉइड 4.0.4) और एंड्रॉइड के साथ टैब 10.1 के जेनिमोशन एमुलेटर पर 4.3 करता है और यह अजीब है ...
+0

संयुक्त राज्य अमेरिका नेशनल लाइब्रेरी सर्विस फॉर द ब्लाइंड के लिए प्रोजेक्ट में, बुक्रेडर ने ऑडियो प्रारूप में पुस्तकें डाउनलोड कीं। प्रत्येक पुस्तक पेशेवर पाठकों द्वारा पढ़ी गई थी। अन्य अभिगम्यता सुविधाओं ने काम किया लेकिन मंच और एंड्रॉइड संस्करण द्वारा समर्थित समर्थन। – maxweber

उत्तर

1

4 ..String.substring() के प्रलेखन के अनुसार मूल स्ट्रिंग में प्रारंभ सूचकांक प्रारंभ होता है, दूसरा तर्क मूल स्ट्रिंग में एंड इंडेक्स है।

उदाहरण:

String text = "Hello"; 
partOfText = text.substring(2,text.length() - 1); 

partOfText करने के लिए "Llo"

तो अपने निरंतर MAX_TEXT_LENGTH पहली बार एक तर्क के रूप में रख कर (पहले चार सूचकांक 0 है), यह सूचकांक 3800 में शुरू होगा लेने के लिए बराबर होती है सबस्ट्रिंग बाहर।

http://developer.android.com/reference/java/lang/String.html#substring(int)

+0

हाय, धन्यवाद, लेकिन यदि आप https://developer.android.com/reference/java/lang/String.html#substring(int, int) देखते हैं तो आप देखेंगे कि एंड सिंबल अनन्य है और मेरा कार्यान्वयन सही है। इसके अलावा यह मेरा सवाल नहीं है। मेरा सवाल यह है कि एंड्रॉइड गैलेक्सी टैब 10.1 पर एक्सेसिबिलिटी का यह प्रतिबंध क्यों है? – mig35

+0

और आपका उदाहरण "हैलो" स्ट्रिंग से "ll" returens ... – mig35

+0

उस मामले में खेद है कि मैंने आपके प्रश्न को गलत समझा – Tweet

0

आप सही MAX_TEXT_LENGTH हैं 3800

अपने संदेह के बारे में, है

इस कोड:

event.getText().add(trimText.substring(MAX_TEXT_LENGTH, trimText.length())); 
     } 

आप trimText को MAX_TEXT_LENGTH से "trimText" सबस्ट्रिंग की कोशिश कर रहे लम्बाई()! मानते हैं कि trimText = "STACK", trimText.length() = 5, तो trimText.substring (3800,5) होने जा रहा है?

सबसे पहले, इसका अर्थ यह नहीं है कि इसका उपयोग सही ढंग से किया जाएगा: trimText.substring (0,2) = "ST";

+0

हां, मुझे पता है कि यह पाठ MAX_TEXT_LENGTH से कम होने पर यह पंक्ति गिर जाएगी। लेकिन मेरे मामले में यह नहीं है। इसलिए मैं इस चेक को स्टैक ओवरफ्लो कोड के लिए हटा देता हूं। इसके अलावा मेरे कोड में इस पंक्ति पर टिप्पणी की गई है। और अगर मैं इस लाइन को अपूर्ण करता हूं तो कुछ भी नहीं खेलेंगे। और यह सवाल है - क्यों? :) यह सवाल काफी पुराना है .. मैंने पहले ही इस परियोजना को समाप्त कर लिया है। – mig35