私は、Androidのビュー階層がどのように機能するかを理解することを目的とする唯一の目的でアプリケーションを作成しています。私は今、本当に厳しい問題を抱えています。私はここで私の説明で簡潔にしようとします。ビュー階層を理解しようとしています
セットアップ:
現在、私は3つのビューを持っています。 2はViewGroups
であり、1はちょうどView
である。私は単純にそうようなビューを表示私のActivity
で
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
::のは、彼らがこの順にしているとしましょう
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
問題:種皮の
onDraw(Canvas canvas)
方法は決してありませんと呼ばれる。私は、私のビューには次元(高さ/幅= 0)がないと言っているが、これは当てはまりません。onLayout()
を無効にすると、私のレイアウトの寸法が得られ、正しいものになります。また、getHeight()/ Width()は、そうであるように正確です。私はdispatchDraw()
をオーバーライドして、自分自身を描くために自分のベースビューを取得することもできます。TestB
でオブジェクトをアニメートしたいと思います。伝統的には、私はメソッドを呼び出すときにinvalidate()
そのオブジェクトをオーバーライドします。しかし、TestB
では、invalidate()
と呼ぶと、ビューは決して再描画されません。onDraw()
メソッドをもう一度呼び出すのは私の親ビューの仕事ですが、私の親ビューはdispatchDraw()
を再度呼び出さないという印象を受けています。
私は私の質問は、なぜ私の親ビューの私のonDraw()
方法で始まるために呼び出されることはありません飽きないだろうしている?推測私の親ビューのどのメソッドが、子どもの1人が無効になったときに呼び出されるはずですか?親はそれが子供が引き出されることを確実にする責任があるか、それともAndroidがそれを世話するのでしょうか? Androidがinvalidate()
に応答すると、なぜ私のTestB
は再び描画されませんか?
あなたのブログのビューグループのこのデモプロジェクトを共有できますか、それは非常に参考になります..おめでとうございます。 – user1201239
私はXMLで指定してもchildViewを追加する必要がありますか? – user1201239
すみません。私はブログやアップロードするものがありません。私は可能な限り役立つように努力します。あなたの最初の質問に答えるには、いいえ。 xmlを展開すると、その子は 'ViewGroup'に含まれます。最も早く検索できるのは 'onFinishInflate()'です。その後、あなたは選択肢があります。 'getChildAt(int index)'メソッドを介して子供を取得するか、 'findViewById(int id)'を使用してください。インデックスは、子がxmlに配置されている順序になります。私はどのようにインデックス作成が子供の中の子供と一緒に働くかわかりません。 – DeeV