0

かなり検索しましたが、問題の解決策が見つかりませんでした。複数のビューを作成してそれらを LinearLayout に追加しようとすると、最初のビュー (ケーキ) のみが表示されます。

ここで、ビューを作成して追加します。

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.image_View);

    PlayAreaView cake = new PlayAreaView(SecondTestActivity.this, R.drawable.cake);
    views.add(cake);
    PlayAreaView bomb = new PlayAreaView(SecondTestActivity.this, R.drawable.bomb);
    views.add(bomb);
    PlayAreaView crown = new PlayAreaView(SecondTestActivity.this, R.drawable.crown);
    views.add(crown);
    PlayAreaView scissors = new PlayAreaView(SecondTestActivity.this, R.drawable.cut);
    views.add(scissors);
    PlayAreaView trash = new PlayAreaView(SecondTestActivity.this, R.drawable.bin_closed);
    views.add(trash);
    PlayAreaView key = new PlayAreaView(SecondTestActivity.this, R.drawable.bullet_key);
    views.add(key);

    LayoutParams params 
    = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

    for(View v : views){
        Log.v("created", "view created");
        v.setLayoutParams(params);
        linearLayout.addView(v);
    }
}

これが私のmain.xmlです

   <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_View"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
        <LinearLayout 
            android:id="@+id/image_View"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
        </LinearLayout>
    </FrameLayout>

単一のビューを作成して問題ありませんが、LinearLayout に複数のビューを追加することはできません。どうしてこれなの?

4

2 に答える 2

0

ここを見ると、基本的に同じ問題を抱えている人がもう一人いました。ただし、レイアウトの方向を宣言していなかったため、デフォルトで水平に設定されていました。あなたのレイアウトでは、水平方向を明示的に宣言しています。これは意図的なものですか (たとえば、アイテムを並べて表示するためなど)? そうでない場合は、向きを垂直に変更してください。

それらを並べて表示する必要がある場合、それを行う方法は頭の中でわかりませんが、各ビューをその前に配置されたビューの隣に宣言する必要があると思います(たとえば、何かを使用して'alignToRightOf' のように. 繰り返しますが、これは暗闇の中を突き刺すだけですが、正しい道に進むことができるかもしれません.

お役に立てれば。

于 2012-04-11T03:22:24.307 に答える
0

私は自分の問題に対する答えを見つけました。アクティビティがビューをどのように処理するかを完全には理解していませんでした。複数の個別のビューを描画するには、配列に追加する各ビューをループし、カスタム ビューでオーバーライドされた描画メソッドを呼び出す必要があります。これを理解した後、複数のビューを作成し、各ビューに個別のドラッグ機能を追加することができました. これがコードです。

    public class ThirdTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    LinearLayout layout = (LinearLayout) findViewById(R.id.main_View);
    layout.addView(new MyCircles(this));
}

private class MyCircles extends View{

    private Context myContext;
    private ArrayList<MyCircle> circles = new ArrayList<MyCircle>();
    private int size = 10;

    public MyCircles(Context context) {
        super(context);
        myContext = context;
        addCircles();
    }

    private void addCircles(){
        for (int i = 0; i < size; i++){
            circles.add(new MyCircle(myContext, R.drawable.skullcrossbones, i * 40, 50));
        }
    }

    @Override
    protected void onDraw(Canvas canvas){
        for (View v : circles){
            v.draw(canvas);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        int mouseX = (int)event.getX();
        int mouseY = (int)event.getY();
        MyCircle image = null;
        for(MyCircle images : circles){
            //Log.v("image checked X: " + images.imageX + ", Y: " + images.imageY, "checked");
            // Is the event inside of this view?
            if(images.getImageRect().contains((int)event.getX(), (int)event.getY()))
            {
                image = images;
            }
        }
        if (image != null){
            if(event.getAction() == MotionEvent.ACTION_DOWN)
            {
                Log.v("touched down", "touched down  at X: " + mouseX + ", Y: " + mouseY);
                image.dragDistance = new Point(mouseX, mouseY);
                bringToFront();
                isSelected();
                return true;
            }
            else if(event.getAction() == MotionEvent.ACTION_MOVE)
            {
                Log.v("move", "moving to X: " + mouseX + ", Y: " + mouseY);
                image.dragDistance.set(mouseX, mouseY);
                invalidate();
                return true;
            }
        }   
        return super.onTouchEvent(event);
    }       
}

private class MyCircle extends View{

    private int imageId;
    private Drawable image;
    private Context myContext;      
    private int size = 48;
    private int imageOffset = size/2;
    private int imageX;
    private int imageY;
    private Point dragDistance;

    public MyCircle(Context context, int id, int x, int y) {
        super(context);
        myContext = context;
        imageId = id;
        imageX = x;
        imageY = y;
        dragDistance = new Point(imageX + imageOffset, imageY + imageOffset);
    }

    public Rect getImageRect(){
        return image.getBounds();
    }

    @Override
    public void draw(Canvas canvas) {
        //Log.v("draw","drawn");
        super.onDraw(canvas);
        image = myContext.getResources().getDrawable(imageId);
        imageX = (dragDistance.x - imageOffset);
        imageY = (dragDistance.y - imageOffset);
        image.setBounds(imageX, imageY, imageX + size, imageY + size);
        image.draw(canvas);
    } 
      }
    }

これは、Android バージョン 2.1 API 7 向けに書かれています。

于 2012-04-11T19:18:39.427 に答える