Basandosi su uno schermo con altre viste in Android
-
16-10-2019 - |
Domanda
Sono stato alla ricerca per le ultime ore per la risposta a una domanda molto stupida. So come disegnare sulla tela in Android se si estende la classe di visualizzazione, modificare OnDraw e setContentView set () per una nuova istanza di quella classe. Tuttavia, ho bisogno di avere anche 2 TextViews e 2 EditTexts in fondo dell'attività e se setContentView () è impostato per avere solo quella vista, questi punti di vista saranno, ovviamente, non visualizzare. Come può mettere tutti questi sullo schermo?
EDIT: Ecco il mio codice: (il nome del pacchetto è 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);
}
}
}
e il 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"/>
Soluzione
In sostanza è necessario definire il file XML con la classe di visualizzazione personalizzata e gli altri widget che avete. Nel tuo caso, non ci sarebbe la visualizzazione personalizzata, 2 textviews e 2 edittexts nel file XML.
Si definisce la visualizzazione personalizzata in XML come qualsiasi altro widget, ad eccezione si utilizza lo spazio della vista e il nome della classe.
<com.example.android.myCustomView
android:id="@+id/my_custom_view"
...
Poi all'interno della vostra attività di una semplice chiamata ??p>
setContentView(R.layout.main);
Modifica:. Il problema è che la classe è privata, quindi "non si vede", quando la vostra attività effettua una chiamata il layout e cerca di gonfiare lo
Edit2: Naturalmente questo non funziona, si sta utilizzando una classe interna! Bisogna comunicare cose come questa, se ci si aspetta di ottenere risposte.
La sintassi XML per una classe interna è diversa.
<view class="com.example.android.MyClass$MyInnerClass"
Altri suggerimenti
Si dovrebbe essere in grado di utilizzare la classe che è esteso nelle vostre res / layout / main.xml proprio come si farebbe con qualsiasi altra classe View, e aggiungere il TextView e EditTexts nel file di layout XML come normale. Non ho personalmente fatto questo, ma ho usato personalizzati classi di visualizzazione in questo modo.
Quindi per la vostra setContentView si sarebbe solo utilizzare il file di layout XML come:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...