5

この API8 の例を改善する方法を提案できる人はいますか? 彼らは、ビューは XML で定義できた可能性があると言っていますが、実際に行ったことは、ビューを Java でコーディングしたことです。彼らがそうしたかった理由がわかります。彼らはいくつかのメンバーを拡張 LinearLayout に追加しており、値は実行時に決定されます。

ああ、宇宙のみんなによると、レイアウト ディレクティブは XML に移行する必要があります。ただし、このアプリでは、ランタイム ロジックでテキストをそのまま設定しておくのが理にかなっています。そのため、ハイブリッド アプローチを採用しています。ビューを膨らませてから、ダイナミック テキストを入力します。それを実現する方法がわからなくて困っています。これがソースと私が試したものです。

API8 の例、List4.javaから

  private class SpeechView extends LinearLayout {
     public SpeechView(Context context, String title, String words) {
        super(context);

        this.setOrientation(VERTICAL);

        // Here we build the child views in code. They could also have
        // been specified in an XML file.

        mTitle = new TextView(context);
        mTitle.setText(title);
        ...

LinearLayout には android:id="@+id/LinearLayout01" があるので、OnCreate でこれを行うことができるはずです。

SpeechView sv = (SpeechView) findViewById(R.id.LinearLayout01);

しかし、追加した最小限のコンストラクターにはヒットしません。

    public class SpeechView extends LinearLayout {
       public SpeechView(Context context) {
          super(context);
          System.out.println("Instantiated SpeechView(Context context)");
       }
       ...
4

2 に答える 2

11

私はちょうどこの正確な問題に遭遇しました。あなた(私たち)が必要だと思うのはこれですが、私はまだいくつかのバグに取り組んでいるので、まだはっきりとは言えません:

public class SpeechView extends LinearLayout {
        public SpeechView(Context context) {
           super(context);
           View.inflate(context, R.layout.main_row, this);
        }
        ...

運が良ければ聞いてみたいです。

編集:このように私のために働いています。

于 2011-01-04T16:41:59.870 に答える
3

ファイル main_row.xml にあるレイアウトを膨張させたようです。正しい?私のニーズは違います。main.xml にあるレイアウトの TextView 子を膨らませたい。

それでも、私は同様のソリューションを使用しました。onCreate で XML から LinearLayout をすでに膨らませていたので、

setContentView(R.layout.main);

残っているのは、View コンストラクターで XML から TextView を膨らませることです。これが私がやった方法です。

LayoutInflater li = LayoutInflater.from(context);
LinearLayout ll = (LinearLayout) li.inflate(R.layout.main, this);
TextView mTitle = (TextView) ll.findViewById(R.id.roleHeading);

R.id.roleHeading は、膨らませている TextView の ID です。

<TextView android:id="@+id/roleHeading" ... />

効率を高めるために、LayoutInflater を Activity メンバーに移動して、一度だけインスタンス化できるようにしました。

于 2011-01-07T22:02:11.033 に答える