2017-05-07 10 views
1

私はアンドロイドの初心者です。私はビューのビューIDを取得したい、ユーザーは現在見ている。 私はもう少し明確な質問をします。ユーザーがMakeMyTripを開き、Flight予約ページまでナビゲートしてください。その特定のレイアウトのView IDを取得したいと思います。 以下は私のサービスクラスとXML設定ファイルです。 window_content_changedイベントのソースノードは、レイアウトのルートノードになるだろうアンドロイドのアクセシビリティサービスを使用してビューIDを取得する方法

Log.d("ViewID", null) 

:私の推測は

Log.d("ViewID",source.getViewIdResourceName()); 
へお電話

がこれをやっているということである

public class MyAccessibilityService extends AccessibilityService { 
@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 

    AccessibilityNodeInfo source = event.getSource(); 

    Log.d("ViewID",source.getViewIdResourceName()); 


} 

@Override 
public void onInterrupt() { 

} 



<accessibility-service 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:accessibilityEventTypes="typeWindowContentChanged" 
android:accessibilityFeedbackType="feedbackGeneric" 
android:accessibilityFlags="flagReportViewIds" 
android:canRetrieveWindowContent="true" 
android:description="@string/accessibility_service_description" 
android:packageNames="com.makemytrip" /> 
+0

このコードを使用して、私のアプリはMakeMyTripアプリケーションの起動時にクラッシュしています。 – Raghu

+0

[LogCat](https://developer.android.com/studio/debug/am-logcat.html)に表示されている完全なエラートレースを追加してください。 – GertG

答えて

0

コンテンツが更新されます。これはviewIDResourceNameを持つことはほとんどありません。ほとんどのビューはリソース名を持たず、ビューへの直接アクセスでアクセスできるビューIDは、何も意味を持たない自動生成されたハッシュだけです。実際のviewResourceNamesを持つビューのみがアクセシビリティサービスに報告された名前を持ちます。したがって、要素にR.id.viewResourceNameがない場合、アクセシビリティサービスはその値に対してnullを報告します。 Android Logユーティリティはnull値を記録できません。少なくとも、空の文字列を指定する必要があります。

代わりにこれを行う必要があります。

String viewIdName = source.getViewIdResourceName(); 
Log.d("ViewID", (viewIdName != null) ? viewIdName : "NO VIEW ID"); 

とりわけ、印刷する場所については、常に「NO VIEW ID」を取得します。ビュー階層をクロールして、リソース名を持つビューを見つける必要があります。 IDを割り当てたボタンや何かを見つけてください!あるいは、潜在的にさまざまなタイプのアクセシビリティイベントを聴くことができます。しかし、注意してください!すべてのイベントにsourceNodesがあるわけではありません!だから、もしあなたが耳を傾けるなら、

android:accessibilityEventTypes="typeAllMask" 

ヌルソースノードもチェックしたいと思うでしょう。あるいは、異なるタイプのヌルポインタ例外が発生します。

EDIT:アクセシビリティ・ノード・ビュー階層全体をログに記録する基本再帰機能。

+0

最初にビューIDを文字列に格納し、それをログに渡しても問題ありません。しかし、私が欲しいのは、特定のレイアウトのView IDです。私はユーザーがその特定のレイアウトを開いた時を知りたい。 – Raghu

+0

私のコードを使用して、そのレイアウト内に存在するすべてのビューのビューIDを取得していますが、レイアウトIDは表示されません。 – Raghu

+0

イベントはおそらくあなたが探しているレイアウトの親を取得しています。アクセシビリティ・ノード階層をクロールして見つけます。 – ChrisCM

関連する問題