2014-05-12 25 views
5

"Hello World!" Metnine sahip bir TextView var. düzeni XML tanımlananTek davranış: TextView'ın AccessibilityNodeInfo'sını oluşturduktan sonra TextView değişikliklerinin getText() yöntemi tarafından döndürülen nesnenin sınıf türü

TextView textView = (TextView)findViewById(R.id.textView); 

textview en GetText() metodu Sınıf java.lang.String aynı AccessibilityNodeInfo oluşturduktan sonra adı ise

//Returns object of String class 
Toast.makeText(getApplicationContext(), textView.getText().getClass().getName(), Toast.LENGTH_LONG).show(); 

amacı, bu android.text.SpannableString nesne döndürür döndürür

//Creating AccessibilityNodeInfo 
AccessibilityNodeInfo info = textView.createAccessibilityNodeInfo(); 

//Returns object of SpannableString 
Toast.makeText(getApplicationContext(), "After creating AccessibilityNodeInfo: " + textView.getText().getClass().getName(), Toast.LENGTH_LONG).show(); 

GetText() yöntemi tarafından döndürülen nesneyle ilgili AccessibilityNodeInfo öğesi nasıl oluşturulur?

Not:Bu yalnızca (en azından API düzeyinde 19) View ve TextView kaynağına bakarak Android 4.3 ve

+0

Daha önemli bir soru, neden umurunda mı? 'getText()' 'CharSequence'ı döndürdüğünü belirtir. Gerçek geri dönüş türü, "CharSequence" in herhangi bir uygulaması olabilir ve bunun hiçbir zaman başka bir şey olmadığına güvenmemelisiniz. –

+0

Eh, burada tam gereksinimleri ayrıntılı olarak ele alamıyorum. Ben sadece diğer geliştiricinin kodu ile uğraşmak zorunda ve AccessiblityNodeInfo oluşturarak kodlarını kırar söz edilebilir. Ve ben sadece düğümün AccessiblityNodeInfo ile ilgili getText() yönteminin dönüş tipi nasıl olduğunu bilmek merak ediyorum? –

+0

Senin için hissediyorum. İşimin% 90'ı kendime ait gerçek bir iş yapmak yerine aşırı derecede zayıf üçüncü parti koduyla uğraşıyor. En iyi uygulama olarak görülüyor, * sorduğun soruya verilen cevapları belgelememek, yani ... iyi şanslar. Android koduna girmeniz gerekebilir ve cevabınızı bulsanız bile, bununla ilgili hiçbir şey yapamayabilirsiniz. –

cevap

3

O select, cut, copy, paste özellikleri AccessibilityNodeInfo eklenen gibi yeni özellikleri kaynaklanmaktadır. Android 4.3'te tanıtıldı ve here belgelendi.

Metni seç ve kopyala/yapıştır

AccessibilityNodeInfo artık düğümünde bir AccessibilityService seçmenize izin API'ler, kesme, kopyalama ve yapıştırma metni sağlar.

bunun ACTION_ARGUMENT_SELECTION_START_INT ve ACTION_ARGUMENT_SELECTION_END_INT ile seçim başlangıç ​​ve bitiş pozisyonu ile geçen erişilebilirlik hizmeti yeni eylem, ACTION_SET_SELECTION kullanabilirsiniz kesmek için metin veya kopya seçimini belirtin.Alternatif olarak, mevcut eylemi kullanarak metnini seçerek, ACTION_NEXT_AT_MOVEMENT_GRANULARITY (daha önce yalnızca imleç konumunu hareket ettirmek için) ve argüman ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN ekleyerek seçebilirsiniz.

ACTION_CUT, ACTION_COPY, daha sonra ACTION_PASTE ile yapıştırmayla kesebilir veya kopyalayabilirsiniz.

Not: Bu yeni API'ler, AccessibilityNodeInfoCompat sınıfıyla birlikte Android Destek Kitaplığı aracılığıyla Android'in önceki sürümleri için de kullanılabilir.

select özelliğini yerleştirmek için, styleable/ markup nesneleri altta yatan metne bağlı olması gerekir. Dolayısıyla metin türü SpannableString için String değiştirilir. İşte

bu özelliği tanıtıldı View.java ait kodudur. Aşağıdaki kod, türü SpannableString olarak değiştirir.

@Override 
public CharSequence getIterableTextForAccessibility() { 
    if (!(mText instanceof Spannable)) { 
     setText(mText, BufferType.SPANNABLE); 
    } 
    return mText; 
} 
2

yukarıda olur, "suçlu" olduğunu tespit edilebilir TextView.getIterableTextForAccessibility(). Bu yöntem, createAccessibilityNodeInfo() bir dizinin parçası olarak adlandırılır

/** 
* @hide 
*/ 
@Override 
public CharSequence getIterableTextForAccessibility() { 
    if (!(mText instanceof Spannable)) { 
     setText(mText, BufferType.SPANNABLE); 
    } 
    return mText; 
} 

View.onInitializeAccessibilityNodeInfoInternal() özellikle de,: olarak TextView'un sınıfında, bu tanımlı.

Belgeli olmadığından, tam olarak nedenini bilmek zor (ya da amaçlanmışsa veya sadece bir yan etkisi olsa bile), ancak metnin bir Spannable olması bile gerekmediği açıktır. önce.

AOSP havuzunun GitHub yansıtıcısında history of TextView.java'dan, bu mantığı tanıtan the commit, Svetoslav Ganov tarafından yapılmıştır. Ona sorduğumda, daha fazla öğrenmek için başka neler yapabileceğinden emin değilim. :) gelince

(ayrı meraktan) bütün mesele tarafını "neden bunu bilmesi gerekir", TextView'un metninin kesin sınıfı alakalı olmamalıdır ... Ben mirası varsayalım Kod String x = (String)textView.getText() gibi bir şey yapıyordu. CharSequence yerine bir String gerekiyorsa, bu çağrıları getText().toString() değiştirerek yeterli olması gerekir.

+0

Bingo! Eski kod, önce bunu bana yönlendiren toString() yöntemini kullanmak yerine cast işlemini kullanıyor. Bir kütüphane geliştiriyorum ve lib'im geliştiricilerin API'ları nasıl kullandıklarının farkında değil. İç çekmek! –

İlgili konular