2013-03-30 4 views
10

Ich entwickle eine barrierefreie Android-Anwendung, in der Menschen die Erreichbarkeitsdienste von Explore by Touch und TalkBack nutzen, um meine Anwendung zu benutzen.Android - TalkBack davon abhalten, TextView-Titel laut zu verkünden

Dies ist mein Android XML-Code:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/forename" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dip" 
     android:layout_marginLeft="15dip" 
     android:textSize="20sp" 
     android:text="@string/forenameText" 
     android:contentDescription="@null"/> 

    <EditText 
     android:id="@+id/EditTextForename" 
     android:layout_width="285dp" 
     android:layout_height="65dp" 
     android:layout_marginTop="10dip" 
     android:layout_marginLeft="15dip" 
     android:hint="@string/forenameHint" 
     android:inputType="textPersonName" 
     android:lines="1" 
     android:singleLine="true" 
     android:textSize="20sp" > 
    </EditText> 

</LinearLayout> 

strings.xml

<string name="forenameText">Forename</string> 
<string name="forenameHint">Enter your forename here</string> 

Textview zeigt den Titel "Vorname" und EditText erlaubt mir einige Details in das Formularfeld eingeben. Das Problem, das ich habe, ist, dass TalkBack, wenn ich meinen Finger über den Bildschirm ziehe, indem ich durch Tippen durch Erforschen nach Berührung suche, den Titel des TextView annimmt und es laut als "Vorname" anmeldet. Ich möchte, dass TextView nur Text anzeigt und keine akustische Rückmeldung liefert.

Ich habe contentDescription auf @null gesetzt, wie Sie aus dem Code oben sehen können, aber TalkBack meldet immer noch "Vorname", wenn mein Finger über die TextView befindet.

ich auch in meiner content Java-Klasse Einstellung versucht:

TextView forename=(TextView)findViewById(R.id.forename); 
forename.setContentDescription(""); 

Allerdings habe ich immer noch das gleiche Problem. Gibt es eine andere Möglichkeit, contentDescription auf null/leer zu setzen und zu verhindern, dass TalkBack es laut ankündigt?

Java-Code:

public class MainActivity extends Activity{ 

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

     View forename = findViewById(R.id.forename); 

     forename.setAccessibilityDelegate(new AccessibilityDelegate() { 
      public boolean performAccessibilityAction (View host, int action, Bundle args){ 
      return true; 
      } 
     }); 
    } 

} 

Antwort

12

Ich habe versucht, das gleiche zu tun heute, und war in der Lage eine 'empty' content auf einem TextView wie so einzustellen (ein non-breaking Leerzeichen verwenden):

decorativeTextView.setContentDescription("\u00A0"); 

jetzt TalkBack sagt nichts für dass TextView.

aber ich stimme Nick zu, das Etikett in Ihrem Fall lesbar zu lassen, weil der Hinweis nur für leere EditTexts gelesen wird.

+0

Dies behebt das Problem. Vielen Dank für deine Hilfe! Bitte sehen Sie meinen Kommentar unter dem Beitrag von Nick. Ich habe ein anderes Problem, das ich jetzt zu lösen versuche. – Alex

+0

re. Dieses neue Problem in Ihrem Kommentar: Ich bekomme dieses Verhalten nicht mit Ihrem ursprünglich geposteten Layout, mit einigen doppelten TextView-EditText-Paaren zum Testen. Siehst du das Eingabefeld für die Barrierefreiheit um ein einzelnes Textfeld herum, das du berührst, wenn dies geschieht? Ich habe festgestellt, dass, wenn der Container (z. B. LinearLayout) stattdessen accessibilityfocus erhält (die yellowbox), die schreibgeschützten Kinder alle gelesen werden und nicht als einzeln "touchable" behandelt werden - also könnten Sie meinen, Sie hätten das TextField berührt , aber das Ereignis (und der Fokus) ging tatsächlich durch zum Elternteil ... – salfon

+0

Meine "Antwort" erwähnt API spezifische Updates, diese Lösung funktioniert auch für ältere Versionen von Android! Vielen Dank! – Matt

2

hatte ich ein ähnliches Problem. Ich löste es schließlich mit der setAccessibilityDelegate Methode und überschreiben View.AccessibilityDelegate'sperformAccessibilityAction Methode.

versuchen Sie dies:

View forename = findViewById(R.id.forename); 

forename.setAccessibilityDelegate(new AccessibilityDelegate() { 
    public boolean performAccessibilityAction (View host, int action, Bundle args){ 
    return true; 
    } 
}); 
+0

Vielen Dank für Ihre Antwort, mmaloon. Ich habe Ihre Lösung auf mein Programm angewendet, aber leider meldet TalkBack immer noch "Vornamen" laut. Ich habe meinen ursprünglichen Post mit Java-Code aktualisiert, den ich derzeit habe. Meine aktuelle Problemumgehung besteht darin, ImageViews anstelle von TextViews zu verwenden, da diese standardmäßig kein akustisches Feedback bieten. – Alex

+0

Ich habe noch eine Frage zu meinem EditText-Formularfeld. Ich habe dort ein "Hinweis" -Attribut, das eine Zeichenkette "forenameHint" liest. Diese Zeichenfolge enthält den folgenden Text: "Geben Sie hier Ihren Vornamen ein". Wenn ich Explore by Touch benutze und meinen Finger über das Formularfeld ziehe, meldet TalkBack "EditBox Geben Sie hier Ihren Vornamen ein". Gibt es eine Möglichkeit, zu verhindern, dass vor jeder Zeichenfolge im Hinweisattribut "EditBox" angezeigt wird? Oder vielleicht ändern Sie es zu etwas benutzerfreundlicher wie "Formularfeld: Geben Sie hier Ihren Vornamen ein"? Vielen Dank im Voraus – Alex

0

ich hatte das gleiche Problem, und das einzige, was für mich gearbeitet wurde android:contentDescription=" " (white space).

+0

Die Einstellung von contentDescription auf white space hat auch in der Vergangenheit für mich funktioniert. Vor ein paar Wochen hatte TalkBack ein neues Update für ihre Software veröffentlicht und danach begann der Screenreader die "Text" Zeichenkette von meinem TextView laut anzukündigen, egal ob die contentDescription auf Leerraum oder Null gesetzt war. Ich bin mir sicher, dass es eine Möglichkeit gibt, das Problem zu lösen, indem erweiterte Zugänglichkeitsdienste wie von mmaloon vorgeschlagen verwendet werden, aber ich habe einfach nicht das Wissen, sie zu implementieren. – Alex

2

Warum möchten Sie nicht, dass die TextView "Vornamen" spricht? Es wird als Bezeichnung für den EditText verwendet. Sobald der Benutzer einen Text eingegeben hat, wird der Hinweis "Geben Sie hier Ihren Vornamen ein" nicht mehr gesprochen - soweit ich weiß - hat der TextView dem Benutzer einen Kontext für den EditText gegeben.

Ähnlich gibt die Ankündigung von "editbox" dem Benutzer die Rolle des EditText-Steuerelements. Während "Formularfeld" möglicherweise besser ist, würde es nicht das gleiche Verhalten wie in anderen Apps und im Betriebssystem sein.

+1

Das ist ein guter Punkt. Der Grund, warum das TextView keine akustische Rückmeldung geben soll, liegt daran, dass ich mehr als ein TextView- und ein EditText-Feld in der Anwendung habe. Das Problem, das ich habe, ist, dass TalkBack, wenn ich auf eines der TextViews zeige, alle TextViews laut ankündigt. Auch wenn ich auf den TextView zeige, der sich ganz unten auf dem Bildschirm befindet, kündigt TalkBack alle TextViews nacheinander an. Ich muss noch herausfinden, was dieses Problem verursacht. – Alex

+0

Was meinen Sie mit "Punkt im TextView"? –

+0

Entschuldigung, ich meine, wenn ich meinen Finger über eine bestimmte TextView auf dem Bildschirm ziehen, werden alle TextViews nacheinander vom Bildschirmleser angesagt. – Alex

14

Seit API 16, Android eingeführt folgendes:

android:importantForAccessibility="no" 

oder

setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO) 

Welche Entwickler Talkback- alle zusammen für bestimmte Ansichten deaktivieren können.

http://developer.android.com/reference/android/view/View.html

+3

Und mit Revision 22 ist es jetzt in der v4-Support-Bibliothek. http://developer.android.com/tools/support-library/index.html – Herrbert74

16

Für eine bessere Abwärtskompatibilität:

ViewCompat.setImportantForAccessibility(
     decorativeTextView, 
     ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO); 
Verwandte Themen