Создать графическое представление программно без макета


Я пытаюсь создать ImageView в коде, установив ресурс image, а затем добавить ImageView в качестве дочернего представления в мой основной вид. Все примеры, которые я нашел, использовали макет для этого. Но внутри конструктора моего представления я не могу понять, как это сделать.

Вот фрагменты кода:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new CanvasView(this));

    }
}

Вид:

public class CanvasView extends SurfaceView implements SurfaceHolder.Callback {
    public CanvasView(Context context) {
        super(context);

        SurfaceHolder sh = getHolder();
        sh.addCallback(this);

        ImageView iv = new ImageView(context);
        iv.setImageResource(R.drawable.wand);

        // how to add iv to myself?
    }
}
2 4

2 ответа:

Вы не можете сделать это таким образом. вам нужен контейнер для обоих: например

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyContainer(this));

    }
}

public class MyContainer extends LinearLayout {
  public MyContainer(Context context) {
    addView(new CanvasView(context));
    ImageView iv = new ImageView(context);
    iv.setImageResource(R.drawable.wand);
    addView(iv);
  }
}

Помните, что если вам нужно раздуть представление непосредственно из xml-файла, то для обоих MyContainer и CanvasView конструктор, который принимает в качестве параметров Context и AttributeSet

Это зависит от макета, который вы используете, вот какой-то код там все представления создаются программно.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout rootLayout = new LinearLayout(getApplicationContext());
    rootLayout.setOrientation(LinearLayout.VERTICAL);

    ImageView imageView = new ImageView(getApplicationContext());
    imageView.setImageResource(R.drawable.sample);

    rootLayout.addView(imageView);

    setContentView(rootLayout);
}