アクティビティに、外部データの実行中のグラフを表示するコードがたくさんありました。アクティビティ コードが乱雑になってきたため、このコードを抽出してクラスを作成することにしましたGraphView
。
public class GraphView extends LinearLayout {
public GraphView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.graph_view, this, true);
}
public void start() {
// Perform initialization (bindings, timers, etc) here
}
public void stop() {
// Unbind, destroy timers, yadda yadda
}
.
.
.
}
この新しいLinearLayout
派生クラスにものを移動するのは簡単でした。しかし、このグラフで使用されるタイマーとイベント リスナーの作成と破棄に関連するライフサイクル管理コードがいくつかありました (たとえば、アクティビティが一時停止されている場合に、このものがバックグラウンドでポーリングしないようにしたかったのです)。
MS Windows のバックグラウンドを持つ私としては、オーバーライド可能なメソッドやそれに似たものを見つけることを期待していましたonCreate()
がonDestroy()
、LinearLayout (またはその継承されたメンバー) にはそのようなものは見つかりませんでした。この初期化コードをすべて Activity に残しておき、それをビューに渡す必要があるのは、このコードをすべて再利用可能なビューにカプセル化するという本来の目的に反しているように思われます。
最終的に、ビューに と の 2 つのパブリック メソッドを追加しました。start()
これらstop()
の呼び出しは、それぞれアクティビティのonResume()
とonPause()
メソッドから行います。
これはうまくいくようですが、ダクトテープを使っているような気がします。通常、どのように行うのか知っている人はいますか? 何かが足りないような気がします...
ベストアンサー1
オーバーライドを利用することもできるかもしれませんprotected void onAttachedToWindow()
が、protected void onDetachedFromWindow()
私は試したことはありませんが、おおよそ希望するタイミングで呼び出される可能性があります。