2

あるアクティビティを別のアクティビティに膨らませる(含める)ことができるかどうかはわかりません。レイアウトxmlを膨らませることができることは知っていますが、これは機能しますが、アクティビティを膨らませることができるかどうか疑問に思っています。たとえば、Activityを拡張するクラスAと、ListActivityを拡張する別のクラスBがあります。クラスA、クラスBに含めて使用できますか?これは私が試したことです:

クラスA:

LayoutInflater inflater = (LayoutInflater) MyActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // inflate list
    BActivity list = new BActivity();

クラスB:

public class BActivity extends ListActivity {
  public void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    List<Model> models= new ArrayList<Model>();
    models.add(new Model("John"));
    models.add(new Model("Cage"));

    setListAdapter(new MyAdapter(this, models));
    ListView list = getListView();
  }
}

およびxml(クラスA xml):(リストを表示したい場所)

 <view class="com.test.BActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >  </view>

これはすべてエラーをスローします:

クラスBActivityの膨張エラー

アクティビティはマニフェストで宣言されます。

私が間違っていることを知っていますか?これは別の活動を膨らませる正しい方法ではありませんか?Android 2.2api8を使用しています。お時間をいただきありがとうございます。

4

2 に答える 2

10

質問のタイトルと問題は、実際には同じものではありません。完全を期すために、両方に答えます。

Androidでアクティビティを膨らませることとビューを膨らませることの違いは何ですか?

違いはありません。最終的に、プロセスとロジックは同じです。ただし、アクティビティには多くの異なるビューが含まれる場合がsetContentView()あり、必要に応じて複数の異なるレイアウトまたはビューを数回使用する場合があります。アクティビティにはレイアウト リソースが必要であり、ビューはレイアウトである場合とそうでない場合があります。

私が間違っていることを知っていますか?

はい。絶対。

  1. あなたのコード:BActivity list = new BActivity();実際にはアクティビティを膨らませていません。アクティビティを構築していますが、開始していません。
  2. XML は として定義BActivityされてViewいますが、コードでは として定義されていますListActivity。これらは2つのまったく異なるものです。AListActivity ListView(拡張されているかどうかに関係なく) があります。Aは ではありListActivity ませんListView
  3. ActivityおよびそのサブクラスはContexts、OS によって管理されるライフサイクルを持つものです。それらはすべてのタイプを含み、それについて話しViewsますが、それ自体はビューではありません。

これは別のアクティビティを膨らませる正しい方法ではありませんか?

いいえ、恐れる必要はありません。答えはそう遠くない。

  1. FAKE ANSWER (完全を期すため)startActivity() - まず、別のアクティビティを開始して膨張させるには、から呼び出す必要がありますContext。AContextは、アプリケーション、アクティビティ、ブロードキャスト レシーバー、またはその他のアプリ コンポーネント (コンポーネント = Android プロジェクト マニフェストで宣言されたオブジェクト) です。したがって、本当に新しいアクティビティを開始したい場合は、次のように変更BActivity list = new BActivity();します。

    Intent _listActivity = new Intent();
    _listActivity.setClass(BActivity.class);
    startActivity(_listActivity);
    
  2. 本当の答え - ただし、リストをクラス A で表示したいので、 BActivityはアクティビティではなく、ビューです。つまり、本当に欲しいのは View を認識させることであり、これは別の解決策です。に変更public class BActivity extends ListActivityするpublic class BActivity extends ListViewと、突然カスタムビューができました!! あとは、List を機能させるだけです。

  3. ビューの構築- ビューはアクティビティとは異なり、public void onCreate(Bundle bundle). からのすべてのものは、BActivity.onCreate()代わりにコンストラクターに配置されます。しかし、適切なコンストラクターがありません...うーん。さて、選択できるコンストラクタは 3 つあります。次のいずれかまたはすべてを追加します (最初は、オプション 1 または 2 のいずれかが必要になるでしょう。ただし、両方を同時に使用することはありません。ヒント ヒントについては、コメントをお読みください

    //This constructor is used when the View is created from code (not XML!!)
    public BActivity(Context context)
    {
    }
    
    //This constructor is used when the View is created from XML (not code!!)
    public BActivity(Context context, AttributeSet attr)
    {
    }
    
    //This constructor is used when the View is created from XML with a Style defined in separate XML.
    public BActivity(Context context, AttributeSet attr, int defStyle)
    {
    }
    
  4. アクティビティの膨張 = ビューの膨張 ここで選択肢があり、ビューを追加するか、ビューを膨張させることができます。どちらにも多くのオプションがあります。あなたの質問に基づいて、ビューを膨らませたいと思います。に変更BActivity list = new BActivity();するだけsetContentView(R.id.MyXML)です。もちろん、MyXML は XML レイアウト ファイルの名前になります。SetContentView は、上記のリストの 2 番目のコンストラクターを使用して、適切なビュー (BActivity) を開きます。

ビューとアクティビティの違いを理解することは重要です。それらの間のプロセスは非常に似ていますが、それら自体は絡み合っていますが、別々の目的を持っています.

  • アクティビティにはビューが必要です。
  • ビューはコンテキスト内にある必要があります。
  • アクティビティはコンテキストですが、コンテキストは他の可能なクラスの 1 つになることもあります。
  • 両方とも、LayoutInflater
  • Anには、 XML ファイル全体を拡張できるActivity便利なメソッドが呼び出されます。setContentView
  • ビューは、 を使用して各ビューを手動でインフレートする必要がありますLayoutInflater object.inflate()
  • アクティビティにはライフサイクルがあります。ビューには代わりに描画サイクルがあります。

詳細については、Android Developers Resources をお読みください。ただし、これらのいくつかは、実験によってのみ学習されます。

これがすべて役に立ったことを願っています!

ファジカルロジック

于 2012-01-10T18:23:14.963 に答える
0

インフレートとは、オブジェクトの XML 記述を解析し、記述された属性で Java オブジェクトを構築することを意味します。アクティビティは XML で詳細に記述されていないため、インフレートする必要はありません。

アクティビティ A をアクティビティ B からディスパッチするか、フラグメントの新しい概念を使用して複数のサブ アクティビティをアクティビティに結合できます。

ところで、(ビュー クラスの 1 つをサブクラス化することによって) カスタム ビューを定義し、それを XML レイアウトで使用することができます。

于 2012-01-10T17:33:49.693 に答える