1

View独自の可視性を決定するための表示ロジックを持つカスタムを作成したいと思います。そのロジックを封じ込めて簡単に再利用できるようにするために、Viewサブクラスを作成してオーバーライドし、可視性が変化する可能性のあるイベントが発生しgetVisibility()たときに無効にすることを計画していました...オーバーライドではなく、呼び出しによって変更されました。この質問に対するRomainGuyの回答を参照してください。ViewViewsetVisibility()getVisibility()

通常のViewライフサイクル/レンダリングプロセスの一部として呼び出され、オーバーライドするのに理想的な特定のメソッドがありますsetVisibilty()か?私はすでに電話をかけているのでinvalidate()、それをオーバーライドして電話をかけることができますsetVisibility()。しかし、それはそれにとって理想的な場所ですか?Viewの属性を設定するinvalidate()と、ベストプラクティスに反するようです。

明確化:View Andrは、カスタムの可視性を変更する可能性のある多くのことがあり、それらのシナリオはカスタムビューの使用法に非常に固有で あると指摘しました。それは非常に真実です。しかし、この質問は、外観を更新するようにトリガーinvalidate()する方法に関するものではありません-ビューの外観が変更されたことをAndroidに伝える標準的な方法のようですよね?代わりに、これは、カスタムが無効になった後の呼び出しに関するベストプラクティスの質問です。たとえば、プロセスの間違った部分に変更を加えたくありません。誰かがリンクを持っているなら、私はAndroidのUIレンダリングプロセスの図を見たいです。setVisibility()ViewonMeasure()

4

1 に答える 1

0

そのような一般的な方法はありません。なぜなら、Viewその可視性を再計算する必要があるすべての可能な状況をカバーする方法がないからです(たとえば、ネットワーク操作の状態の変化など、可視性を変更する非同期イベントについて考えてください。または単純なタイマーですら外れます)。

開発者は、可視性を無効にする必要がある場合を知っており、それに応じてその時点で可視性を変更する必要があります。もちろん、すべてのレイアウトと描画の前に常に可視性を設定することは可能ですが、次のようになります。

  • すべてのケースを網羅しているわけではないのではないかと思います。
  • 1、2か月後に理解するのはおそらく奇妙でしょう。
  • それはやり過ぎです-それはあなたが扱っているモバイルデバイスであり、あなたはその制限を心に留めて効率を目指すべきです。

そうは言っても、可視性を設定した後に呼び出す意味は実際にはわかりませんinvalidate()。プラットフォームによって自動的に実行されます。私は簡単に提案します:

private void invalidateVisibility() {
    // calculate visibility
    setVisibility(calculation_outcome);
    //invalidate();
}

呼び出しをinvalidate()に変更しますinvalidateVisibility()invalidate()何らかの理由で本当に電話をかける必要がある場合は、電話のコメントを外してください。これはおそらく最も効率的な解決策になるでしょう。

編集:

私の答えのポイントは、執筆時点であなたが説明したロジックが(少なくとも私にとっては)そうであるように思われるのと同じくらい一般的なものを提案することでした。メソッドでいくつかの重要な処理が行われていると仮定したinvalidate()ので、それを呼び出す必要があります。しかし、あなたの質問はしばらくの間私を悩ませ、それを4、5回読んだ後、私はついにあなたが正確に何を求めているのかを理解したと思います!:)

私があなたを正しく理解していれば、あなたはすでに、の可視性が変わる可能invalidate()性があるたびに電話をかけています。そのため、簡単にするために、ビューの可視性の変更を無効化プロセスに組み込む必要があります。View

その場合、あなたは正しいです-最初にそれを行うことinvalidate()は完全にOKです。そのため、呼び出しを正確にこの順序で次のように配置しましたinvalidateVisibility()

  • aViewが表示されるようになると、親は再ペイントの必要性について通知を受け取り、invalidate()後で呼び出すと、単に「前のペイント操作とグループ化」する必要があります(これは、保留中のすべてのペイント操作が1つのバッチで処理されるためです)。
  • aViewが非表示になると、自動的に無効化の合図を出します。への別の呼び出しinvalidate()は、単にノーオペレーションになります。

次に、直感があります-これ:

button.setVisible(false/true);
button.invalidate();

疑わしいコードではないようです。そして事実上、それはあなたinvalidate()が変わるものです。invalidate()ただし、 Androidプラットフォームによって1秒間に度も呼び出される可能性があるため、可視性の計算が迅速な操作であることを確認してください。これは主に、UIがアニメーション化されている場合に当てはまります。たとえば、ピンチジェスチャ中にビューの境界を更新します。

それが何らかの形で役立つことを願っています:)

于 2013-02-22T00:02:37.537 に答える