69

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

public BaseActivity extends Activity{....}

public SubActivity は BaseActivity を拡張します{...}

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

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

4

4 に答える 4

138

正確に何を達成しようとしていますか?一部の変数またはレイアウトの一部を除いて、共通の 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;
    }
}

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

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

于 2012-01-11T15:02:09.163 に答える
5

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

始めてみてください。思ったよりも簡単に実行できます。問題が発生した場合は、質問してください。

于 2012-01-11T14:54:46.293 に答える
2

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

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.
    }
}
于 2016-02-17T13:51:20.173 に答える