1

私は過去数時間、非常にばかげた質問への答えを探していました。ビュークラスを拡張し、onDrawを変更し、setContentView()をそのクラスの新しいインスタンスに設定すると、Androidでキャンバスに描画する方法を知っています。ただし、アクティビティの下部に 2 つの TextView と 2 つの EditText も必要です。 setContentView() がそのビューのみを持つように設定されている場合、これらのビューは明らかに表示されません。これらすべてを画面に表示するにはどうすればよいでしょうか。

編集:ここに私のコードがあります:(パッケージ名はandroid.physicsengineです)

package android.physicsengine;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;

public class ResultantForceEngine extends Activity {
private EditText mag;
private EditText dir;
private View image;
private RelativeLayout layout;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.resultant_force);

    mag = (EditText)findViewById(R.id.magnitude);
    dir = (EditText)findViewById(R.id.direction);
}

public class MyView extends View{
    public MyView(Context context){

        super(context);
    }
    public MyView(Context context, AttributeSet attrs){

        super(context, attrs);

    }
    public MyView(Context context, AttributeSet attrs, int defStyle){

        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.drawColor(Color.BLACK);
        Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        circlePaint.setColor(Color.RED);
        canvas.drawLine(canvas.getWidth()/2, canvas.getHeight()/2-200, canvas.getWidth()/2 ,canvas.getHeight()/2+200, circlePaint);
        canvas.drawLine(canvas.getWidth()/2-200, canvas.getHeight()/2, canvas.getWidth()/2+200 ,canvas.getHeight()/2, circlePaint);
    }
}
}

そしてxml

<view class="android.physicsengine.ResultantForceEngine$MyView"
              android:id="@+id/image"
              android:layout_alignParentLeft="true"
              android:layout_alignParentRight="true"
              android:layout_alignParentTop="true"
              android:layout_alignParentBottom="true"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" />
<TextView     android:id="@+id/magText"
              android:text="Magnitude (N) ="
              android:textSize="15dip"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:gravity="center_vertical" 
              android:layout_alignParentLeft="true"
              android:layout_alignParentBottom="true" />
    <EditText android:id="@+id/magnitude"
              android:inputType="numberDecimal"
              android:layout_alignParentBottom="true" 
              android:layout_toRightOf ="@id/magText"
              android:layout_width="wrap_content"
              android:padding="3dip"
              android:layout_height="wrap_content" />

    <TextView android:id="@+id/dirText"
              android:text="Angle (deg) ="
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="15dip"
              android:layout_alignParentBottom="true"
              android:layout_toRightOf ="@id/magnitude"
              android:padding="3dip"
              android:gravity="center_vertical" />
    <EditText android:id="@+id/direction"
              android:inputType="numberDecimal"
              android:layout_alignParentBottom="true" 
              android:layout_toRightOf ="@id/dirText"
              android:layout_alignParentRight="true"
              android:layout_height="wrap_content" 
              android:padding="3dip"
              android:layout_width="wrap_content"/>

4

2 に答える 2

3

基本的に、カスタム ビュー クラスとその他のウィジェットを使用して XML ファイルを定義する必要があります。あなたの場合、XML ファイルにはカスタム ビュー、2 つのテキストビュー、2 つの編集テキストがあります。

カスタム ビューは、ビューの名前空間とクラス名を使用することを除いて、他のウィジェットと同じように XML で定義します。

<com.example.android.myCustomView
    android:id="@+id/my_custom_view"
    ...

次に、アクティビティ内で簡単な呼び出しを行います

setContentView(R.layout.main); 

編集:問題は、クラスがプライベートであるため、アクティビティがレイアウトを呼び出してインフレートしようとすると「表示されない」ことです。

Edit2: もちろん、これは機能しません。内部クラスを使用しています! 答えを期待するなら、このようなことを伝えなければなりません。

内部クラスの XML 構文は異なります。

<view class="com.example.android.MyClass$MyInnerClass"
于 2011-01-21T17:07:56.520 に答える
0

res/layout/main.xml で拡張したクラスは、他の View クラスと同じように使用でき、TextView と EditTexts をレイアウト .xml ファイルに通常どおり追加できます。私は個人的にこれを行ったことはありませんが、この方法でカスタム View クラスを使用しました。

次に、 setContentView に対して、レイアウト .xml ファイルを次のように使用します。

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ...
于 2011-01-21T16:54:57.830 に答える