Я пытаюсь создать AccessibilityNodeInfo из TextView, используя следующий код:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_user);

    userTexView = (TextView) findViewById(R.id.userTextView);
    userTexView.createAccessibilityNodeInfo();
}

Activity_user.xml

<TextView
    android:id="@+id/userTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/UserText"
    android:contentDescription="@string/UserDescription" />

Но я получаю исключение NullPointerException.

05-20 07:15:14.383 29984 29984 E AndroidRuntime: Caused by: java.lang.NullPointerException
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.view.View.onInitializeAccessibilityNodeInfoInternal(View.java:5059)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.view.View.onInitializeAccessibilityNodeInfo(View.java:5004)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.widget.TextView.onInitializeAccessibilityNodeInfo(TextView.java:8048)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.view.View.createAccessibilityNodeInfoInternal(View.java:4965)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.view.View.createAccessibilityNodeInfo(View.java:4952)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at in.mobilitas.mhealth.ui.MHealthActivity.onCreate(MHealthActivity.java:82)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.app.Activity.performCreate(Activity.java:5150)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2192)
05-20 07:15:14.383 29984 29984 E AndroidRuntime:    ... 11 more

Кто-нибудь сталкивался с подобной проблемой?

1
Manish Mulimani 20 Май 2014 в 06:05

2 ответа

Лучший ответ

createAccessibilityNodeInfo() не может быть вызван, пока представление не будет прикреплено к окну. См. Исходный код для класса View:

void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
   Rect bounds = mAttachInfo.mTmpInvalRect;

Границы текущего представления используются для заполнения экземпляра AccessibilityNodeInfo, и они не определены до присоединения представления.

3
matiash 20 Май 2014 в 02:31

Ответ accept правильный, я просто добавляю один способ обойти его:

В onCreate:

View view = (View) findViewById(R.id.my_view);
view.setAccessibilityDelegate(new View.AccessibilityDelegate() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        // Do some stuff with info
    }
}
1
Kristian 13 Июн 2014 в 17:49