web-dev-qa-db-ja.com

android独自のアクティビティを作成して拡張するには?

アプリケーションでいくつかの一般的なタスクを実行するActivityを拡張し、それからactivitiesを拡張する基本クラスを次の形式で作成する必要があります。

public BaseActivity extends Activity {....}

public SubActivity extends BaseActivity {...}

in SubActivity私はBaseActivityで定義されたいくつかの変数とUIコンポーネントに値を与える必要があり、SubActivityに従って異なるレイアウトを定義する必要があるかもしれませんいくつかのフラグ値、(in SubActivityBaseActivityで定義されているasyncTaskを実行したい。

これは可能ですか?はいの場合、役立つチュートリアルはありますか?前もって感謝します

66
user173488

正確に何を達成しようとしていますか?いくつかの変数またはレイアウトの一部を除いて、共通のUIを持つ2つの異なるアクティビティがありますか?

この場合、基本抽象アクティビティと、2つの具体的な継承サブクラスを持つことをお勧めします。基本アクティビティですべての一般的な動作を定義し、違いの抽象メソッドを使用して、実際の実装でオーバーライドします。

たとえば、異なるレイアウトリソースを持つ2つのアクティビティの場合:

public abstract class BaseActivity extends Activity {
    @Override
    public void onCreate(bundle) {
        super.onCreate(bundle);
        setContentView(getLayoutResourceId());
    }

    protected abstract int getLayoutResourceId();
}

public class Activity1 extends BaseActivity {
    @Override
    public void onCreate(bundle) {
        super.onCreate(bundle);
        // do extra stuff on your resources, using findViewById on your layout_for_activity1
    }

    @Override
    protected int getLayoutResourceId() {
        return R.layout.layout_for_activity1;
    }
}

サブクラスに固有のすべてのビットに対して、より多くの抽象メソッドを使用できます。

私の意見では、それを行うことは、具体的なサブクラスを具体的なスーパークラスに持つよりもはるかに優れています。これは多くの問題を引き起こす可能性があり、通常はデバッグが困難です。

135
Guillaume

この質問にはすでに非常に良い答えがあります。
しかしながら。私の答えは、いくつかの実例を探している人々のためです。
これが完全な作業です->[〜#〜] code [〜#〜]

enter image description here
ここでは新しいことは何も行っていません。他の継承シナリオと同じです(複数の場所で共通の動作が必要ですが、その動作を一度だけ記述したい場合)。

ADVANTAGE:これは、コードの読みやすさ、保守性、およびなんとかすることを提供します。しかし、これらの可能性の後ではありません。あなたの脳がガゼルのように走っている場合、それらはあなたにとって重要ではありません。
私たちは本当の継承力「CONTROL」を求めています。 (それは実生活でも起こります。親が子を制御します:))。

この例では、2つのアクティビティMainActivityとOtherActivityがあります。両方のアクティビティのレイアウトは異なりますが、アニメーションまたはウェルカムメッセージで両方を開始する必要があります。

最初のタスクは、一般的な動作を見つけることです。ここ->アニメーションでアクティビティを開始します。
共通の「もの」が見つかったため、BaseClassでその動作を記述します(AnimationActivity)。
MainActivityおよびOtherActivityはAnimationActivityを継承します。

したがって、コードは `

BaseActivity

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}

児童活動

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

この設計アプローチは、多くのControlおよびFlexibility(MODIFIERのパワーを提供します)。

1)CONTROL:onCreate()内にアニメーションメソッドを保持するアクティビティをアニメーションで開始する必要があると判断した場合。 onCreate(Bundle bundle)メソッド内にメソッドを保持します。修飾子を変更するだけで、子アクティビティを制御できます。
修飾子を次のように保持する場合
final:子アクティビティは親アニメーションから始まります。
要約:子どものアクティビティは、独自のアニメーションを提供する必要があります。
修飾子なし:子メソッドは、アニメーションメソッドをオーバーライドすることで独自のアニメーションを持つことができます。そうでない場合、子は親アニメーションを持ちます。

2)柔軟性:onCreate()内にアニメーションメソッドを保持しないonCreate(Bundle bundle)内にアニメーションメソッドを保持しないことで、子アクティビティの柔軟性を提供できます。現在、アクティビティには、親アニメーションまたは独自のアニメーションを使用する、またはアニメーションをまったく使用しないという柔軟性があります。
それが役に立てば幸い。
幸せな学習。

`

5
Rohit Singh

はい、できます。基本的な継承ルールを念頭に置いてください。内部のAsyncTaskアクティビティと、BaseActivityで定義されたプロパティをプライベートではなく保護した場合、それらを継承します。 subActivitiesのインスタンスのみが実際に使用されるため、私が今見ているものからBaseActivityを抽象クラスにする必要があると思います。

始めて試してみてください。思ったよりも簡単に作業できます。問題が発生した場合は、お尋ねください。

5
J. Maes

@Guillaumeのソリューションへの簡単な方法を見つけました。 ContentViewBaseActivityを1回だけ設定し、それを拡張するアクティビティで設定しないでください。

public abstract class BaseActivity extends Activity {
    @Override
    public void onCreate(bundle) {
        super.onCreate(bundle);
        setContentView(activity_main);
    }
}

public class Activity1 extends BaseActivity {
    @Override
    public void onCreate(bundle) {
        super.onCreate(bundle);
        // setContentView(activity_activity1)  // Do NOT call this.
    }
}
3
Seagull