Хорошо, я новичок в программировании Android
, мне сложно с графической частью. Поймите красоту создания макета в файле XML
, но потеряли доступ к различным элементам, особенно элемент View для рисования на нем.
См. пример моего макета main.xml
здесь;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Title" android:text="App title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:background="#A0A0FF"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/PaperLayout"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:focusable="true">
<View
android:id="@+id/Paper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/File"
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="34dp"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:clickable="true" android:textSize="10sp"
android:text="File" />
<Button
android:id="@+id/Edit"
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="34dp"
android:clickable="true"
android:textSize="10sp" android:text="Edit" />
</LinearLayout>
</LinearLayout>
Как вы можете видеть, у меня есть настраиваемое приложение title bar
, затем View
заполнение середины и, наконец, два button
внизу. Захват событий button
s и ответы на них, например изменение текста строки заголовка и изменение фона фона View
отлично, но как я могу получить доступ и, что еще важнее, использовать представление, определенное в main.xml
UPDATE:
Большое спасибо за ваше предложение, но кроме того, мне нужен View
, а не ImageView
, и вам не хватает параметра на canvas.drawText()
и конечной скобки, он не работает.
Теперь это, скорее всего, потому, что вы упустили тот факт, что я новичок и предполагаю, что я могу заполнить любые пробелы.
Теперь, прежде всего, я НЕ понимаю, почему в моем макете main.xml
я могу создать элемент View
или даже SurfaceView
, который мне нужен, но в соответствии с вашим решением я даже не укажите View как <View ....../>
В любом случае я отредактировал свой main.xml
в соответствии с вашим решением и немного упростил его для простоты;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Title" android:text="App title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:background="#A0A0FF"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/PaperLayout"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:focusable="true">
<com.example.MyApp.CustomView
android:id="@+id/Paper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<com.example.colorbook.CustomView/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/File"
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="34dp"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:clickable="true"
android:textSize="10sp"
android:text="File" />
</LinearLayout>
</LinearLayout>
В моем основном java файле MyApp.java
. Я добавил это после onCreate()
;
public class CustomView extends ImageView {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("Your Text", 1, 1, null);
}
}
Но я получаю ошибку в части CustomView;
"Неявный супер-конструктор ImageView()
- это undefined для конструктора по умолчанию. Необходимо определить явный конструктор"
Eclipse предлагает 3 быстрых исправления о добавлении конструктора, но ни один не помогает, но он удаляет ошибку, но дает ошибку при запуске приложения.
Я надеюсь, что кто-то может сломать это для меня и предоставить решение, и, возможно, объяснить, почему я не могу просто создать элемент View в моем макете main.xml
и нарисовать его в коде.
UPDATE:
Хорошо, я все еще пытаюсь использовать ваше решение, которое все еще дает мне проблемы и различные ошибки. Но в первую очередь я до сих пор не понимаю, почему мне нужно создать пользовательский класс для использования в моем layout
, когда мне придется использовать даже вариант редактора wysiwyg для вставки элемента View и "just" рисовать его в мой главный, ну пока только файл кода. Так что pleeeeeease кто-то ответить мне, что один.
В любом случае, теперь у меня есть:
package com.example.myapp;
import com.example.myapp.CustomView;
//and here comes other import
public class MyApp extends Activity {
//rest of code including OnCreate()
И я создал новый класс, новый файл CustomView.Java, где я прямо вставил ваш код, чтобы он выглядел следующим образом:
public class CustomView extends ImageView {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setARGB(255, 150, 205, 129);
paint.setTextSize(20);
canvas.drawText("Your Text", 1, 1, paint);
}
}
Хорошо, поэтому этот класс кода хочет, чтобы я добавил import
для ImageView
, Canvas
и Paint
, что я и сделал, а затем снова возвращаюсь к ошибке public class *CustomView*
part;
"Неявный супер-конструктор ImageView() - undefined для конструктора по умолчанию. Необходимо определить явный конструктор".
Я ценю, что вы пытаетесь мне помочь, СПАСИБО!
Чтобы создать представление, создайте свой собственный пользовательский вид.
Для этого вам нужно добавить новый класс. С eclipse это просто File- > New- > Class и там вы идете. Переопределите метод onDraw() в соответствии с вашими потребностями и добавьте свой CustomView в свой макет:
public class CustomView extends ImageView {
// The needed constructors:
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setARGB(255, 150, 205, 129);
paint.setTextSize(20);
canvas.drawText("Your Text", xposition, yposition, paint);
}
}
код > В вашем xml файле вы добавляете свой CustomView следующим образом:
<com.example.CustomView
android:id="@+id/yourID"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</com.example.CustomView>
Если вы не хотите нарисовать из своей резервной папки, укажите "src" -параметр вашего customView.
переопределить метод onCreate, а затем использовать метод findViewById
. Например, чтобы использовать и изменять цвет фона представления, используйте следующее:
View v = (View)findViewById(R.id.Paper);
v.setBackgroundColor(myColor);
Аналогичным образом измените любой другой вид/виджет, определенный в вашем макете
использовать представление, определенное в main.xml в Activity, переопределить способ Activity onCreate
, например:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Изменить: извините, я неправильно читаю "нарисовать на виду" как "рисование" в вашем вопросе:) См. ответ L0rdAli3n для этого.