Android:兄弟ビューへのアクセス

android android-layout
Android:兄弟ビューへのアクセス

カスタムビューを持つXML FrameLayoutを拡張するアクティビティと、多数のText / ImageViewを含むRelativeLayoutがあります。

カスタム ‘CanvasView’では、描画を行い、 `onTouchEvent()`などをインターセプトします。 ビューでのユーザーのアクションに基づいて、TextViewの1つ、特にtoolbar_notificationを更新します。 CanvasView自体でこれを行うのが最善ですが、TextViewはその子ビューではないため、 `findViewById()`を介してアクセスできません。

https://stackoverflow.com/questions/5004013/get-other-child-that-shares-parent-with-the-current-view [このソリューション]を試しましたが、「原因: android.view.InflateException:バイナリXMLファイル行#5:親ビューのプロパティに次の方法でアクセスしようとするたびに、クラスmy.package.name.CanvasViewの膨張エラー

ViewGroup parentView = (ViewGroup) getParent();
parentView.getChildCount();

助言がありますか?

ありがとう、

Paul

  2  0


ベストアンサー

カスタムキャンバスにリスナーインターフェイスを作成し、アクティビティに実装させます。 タッチイベントでは、リスナーメソッドを呼び出してアクティビティに戻ることができます。

そうする理由:

  • アクティビティは、階層内のすべてのビューについて既に知っています。

  • このメソッドは、TextViewが動き回っても機能します。

  • フレームワークの動作方法との一貫性

カスタムキャンバスで:

public static interface Listener {
    public void someEventHappened(String moreInfo);
}

private Listener listener;

public void setListener(Listener listener) { this.listener = listener; }

アクティビティで、インターフェースを実装します

パブリッククラスMyActivityはActivityがMyCanvas.Listenerを実装する{…​

アクティビティのonCreate()メソッドでリスナーを設定します。

myCanvas.setListener(this);

次に、TextViewを変更するコードをアクティビティ内のコールバックに配置できます。

public void someEventHappened(String moreInfo) {
    TextView myTextView = (TextView) findViewById(R.id.my_text_view);
    myTextView.setText(moreInfo);
}

3


「NullPointerException」を取得した場合、「parentView」が「null」であることを意味します。「CanvasView」内で「getParent」()をクエリしていますか? それとも「アクティビティ」でそれをやっていますか? 動作するはずのコードでは、 `CanvasView`内にある必要があります。

また、「CanvasView」の「context」を「Activity」にキャストして、必要な子を取得することもできます。 これが役立つことを願っています

0


タイトルとURLをコピーしました