Рисование на экране с другими видами в Android

1

Я искал последние несколько часов, чтобы ответить на очень глупый вопрос. Я знаю, как рисовать на холсте в android, если вы расширяете класс представления, изменяете onDraw и устанавливаете setContentView() в новый экземпляр этого класса. Тем не менее, мне нужно также иметь 2 TextViews и 2 EditTexts в нижней части действия, и если для setContentView() установлено только это представление, эти представления, очевидно, не будут отображаться. Как можно поместить все это на экран?

EDIT: Вот мой код: (имя пакета - 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"/>

Теги:
android-edittext
android-textview
android-layout
android-canvas

2 ответа

3
Лучший ответ

В принципе, вам нужно определить свой XML файл с помощью своего настраиваемого класса просмотра и других виджетов, которые у вас есть. В вашем случае в файле XML будет отображаться пользовательский вид, 2 текстовых изображения и 2 edittexts.

Вы определяете пользовательский вид в XML так же, как и любой другой виджет, за исключением того, что вы используете пространство имен представления и имя класса.

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

Затем внутри вашей активности прост звонок

setContentView(R.layout.main); 

Изменить: проблема заключается в том, что ваш класс является закрытым, поэтому он "не отображается", когда ваша активность вызывает вызов макета и пытается его раздуть.

Edit2: Конечно, это не сработает, вы используете внутренний класс! Вы должны сообщать такие вещи, если вы ожидаете получить ответы.

Синтаксис XML для внутреннего класса отличается.

<view class="com.example.android.MyClass$MyInnerClass"
  • 0
    Я попытался это, и я получил ошибку разбора времени выполнения XML. Я уверен, что все правильно написал. Я добавлю этот код выше.
  • 0
    Том, у вашего пользовательского представления должен быть публичный специальный конструктор, чтобы LayoutInflater мог создать экземпляр вашего пользовательского представления. Ваш класс customView должен иметь ctor, показанный по адресу d.android.com/reference/android/view/… , android.util.AttributeSet). Пример реализации доступен по адресу developer.android.com/resources/samples/ApiDemos/src/com/…
Показать ещё 11 комментариев
0

Вы должны иметь возможность использовать класс, который вы расширили в res/layout/main.xml, как и любой другой класс View, и добавьте TextView и EditTexts в макет. XML файл, как обычно. Я лично не сделал этого, но я использовал пользовательские классы View таким образом.

Затем для вашего setContentView вы просто используете файл .xml макета, например:

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню