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

1

Хорошо, я новичок в программировании 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 для конструктора по умолчанию. Необходимо определить явный конструктор".

Я ценю, что вы пытаетесь мне помочь, СПАСИБО!

  • 0
    Нет необходимости в «программировании Android» в заголовке, вот для чего нужны теги.
  • 0
    Хорошо, спасибо, но мне не разрешили использовать тег "Программирование"
Показать ещё 2 комментария
Теги:
view
layout
drawing

3 ответа

3

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

Для этого вам нужно добавить новый класс. С 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.

  • 0
    Это для вашего предложения, однако, кроме того, что мне нужен View, а не ImageView, и у вас отсутствует конечная скобка, это не работает.
  • 0
    Что ж, вам нужно изучить некоторые основы Java, прежде чем писать собственное приложение ... Я уточню свой ответ, чтобы прояснить ситуацию. Потерпи. Извините за недостающую скобку, я опустил свой пример и понизился до большого количества :)
Показать ещё 4 комментария
0

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

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

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

  • 0
    Также большое спасибо за ответ. Похоже, что я не прояснил в своем вопросе, что на самом деле я могу очень просто изменить цвет фона, выполняя то, что вы и Axarydax предлагаете. Мой настоящий вопрос в том, как мне рисовать графику в этом представлении?
  • 0
    Я бы пошел с тем, что L0rdAli3n сказал в приведенном выше посте
0

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

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

}

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

  • 0
    Спасибо за ответ, однако эту часть я знаю;) И, как я уже писал, я могу изменить цвет фона элементов View, но как мне на самом деле рисовать графику в этом View?

Ещё вопросы

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