Программирование на Android - Как получить доступ к представлению XML в макете main.xml, используя код - PullRequest
1 голос
/ 28 декабря 2010

Ладно, я новичок в 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

ОБНОВЛЕНИЕ : Большое спасибо за ваше предложение, однако, кроме того, что мне нужен View, а не ImageView, а у вас отсутствует параметр в canvas.drawText() и конечная скобка, он неработа.

Теперь это, скорее всего, потому что вы пропустили тот факт, что я новичок и предполагая, что я могу заполнить любые пробелы.

Теперь, прежде всего, я НЕ понимаю, почему в моем main.xml файл макета. Я могу создать элемент View или даже SurfaceView, что мне и нужно, но в соответствии с вашим решением я даже не определяю вид как <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() не определен для конструктора по умолчанию. Необходимо определить явный конструктор"

Eclipse предлагает 3 быстрых исправления о добавлении конструктора, но ни один не помогает, хорошо, он удаляет ошибку, но даетошибка приложения во время работы.

Я надеюсь, что кто-то может разбить это для меня и предложить решение, и, возможно, объяснить, почему я не могу просто создать элемент View в моем файле макета main.xml и рисовать на немв коде.

ОБНОВЛЕНИЕ : Хорошо, я все еще пытаюсь использовать ваше решение, которое все еще дает мне проблемы и различные ошибки.Но в первую очередь я все еще НЕ понимаю, почему мне нужно создать собственный класс для использования в моем layout, когда мне нужно даже использовать редактор макетов wysiwyg, чтобы вставить элемент View и «просто» нарисовать его вмой главный, ну пока только кодовый файл.Итак, пожалуйста, кто-нибудь ответит мне на этот вопрос.

В любом случае, теперь у меня есть;

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 s для ImageView, Canvas и Paint, что я и сделал, и затем снова я возвращаюсь к ошибкеобщественный класс *CustomView* часть; "Неявный супер-конструктор ImageView () не определен для конструктора по умолчанию. Необходимо определить явный конструктор".

Я благодарен вам за помощь, СПАСИБО!

Ответы [ 3 ]

3 голосов
/ 28 декабря 2010

Чтобы нарисовать вид, создайте свой собственный вид.

Для этого вам нужно добавить новый класс. С затмением это просто Файл-> Новый-> Класс и все. Переопределите 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);
    }</p>

<pre><code>@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>

Если вы не хотите рисовать на отрисовке из вашей res-папки, укажите параметр "src" в вашем customView.

0 голосов
/ 28 декабря 2010

переопределяет метод onCreate, а затем использует метод findViewById.Например, для использования и изменения цвета фона представления используйте следующее:

View v = (View)findViewById(R.id.Paper);
v.setBackgroundColor(myColor);

Аналогичным образом измените любой другой вид / виджет, определенный в макете

0 голосов
/ 28 декабря 2010

для использования представления, определенного в main.xml в Activity, переопределите метод onCreate Activity, такой как:

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

}

edit: извините, я неправильно прочитал "draw on view" как "draw view" в вашем вопросе :) Смотрите ответ L0rdAli3n.

...