2014-01-05 5 views
1

мне нужно создать макет, который должен быть разделен пополам, как это:Android, живопись самостоятельно, «разделить» раскладка не работает

------- 
|  | 
| A | 
|  | 
------- 
|  | 
| B | 
|  | 
------- 

Где:
A - это место, где я могу нарисовать точки пальцем;
B - это пример ListView.

Похоже, что ни один объект из класса SampleView не был создан, поэтому покраска в A не работает.
Что не так с этим?
Как мне исправить покраску?

drawing_activity.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_weight="1" 
android:orientation="vertical" > 



    <View 
     class="com.example.proj.SampleView" 
     android:id="@+id/sampleView1" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight=".50" /> 



    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight=".50" > 
    </ListView> 
</LinearLayout> 

SampleView.java:

package com.example.proj; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class SampleView extends View implements OnTouchListener { 
    private static final String TAG = "SampleView"; 
    List<Point> points = new ArrayList<Point>(); 
    Paint paint = new Paint(); 

    public SampleView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(this); 

     paint.setColor(Color.BLACK); 
     paint.setAntiAlias(true); 

     Log.i(TAG, "Created SampleView!"); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     for (Point point : points) { 
      canvas.drawCircle(point.x, point.y, 5, paint); 
      Log.d(TAG, "Painting: "+point); 
     } 
    } 

    public boolean onTouch(View view, MotionEvent event) { 
     if(event.getAction() != MotionEvent.ACTION_DOWN) 
      return super.onTouchEvent(event); 
     Point point = new Point(); 
     point.x = event.getX(); 
     point.y = event.getY(); 
     points.add(point); 
     invalidate(); 
     Log.d(TAG, "point: " + point); 
     return true; 
    } 

} 


class Point { 
    float x, y; 

    @Override 
    public String toString() { 
     return x + ", " + y; 
    } 
} 

MainActivity.java:

package com.example.proj; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.app.Activity; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.drawing_activity); 
     final ListView listview = (ListView) findViewById(R.id.listView1); 
     String[] values = new String[] { "Element1", "Element2" }; 

     final ArrayList<String> list = new ArrayList<String>(); 
     for (int i = 0; i < values.length; ++i) { 
      list.add(values[i]); 
     } 
     final StableArrayAdapter adapter = new StableArrayAdapter(this, 
      android.R.layout.simple_list_item_1, list); 
     listview.setAdapter(adapter); 
    } 

} 
+0

У вас есть это сообщение «Created SampleView!» в журнале? –

+0

Нет, это странно –

+0

хорошо, мой ответ, надеюсь, это устраняет проблему. –

ответ

2

В йо ур XML должен быть:

<com.example.proj.SampleView 
     android:id="@+id/sampleView1" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight=".50" /> 

ИЛИ: вид с не -capitalized «V»

<view 
     class="com.example.proj.SampleView" 
     android:id="@+id/sampleView1" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight=".50" /> 

Оба теги и вид существует, однако View сгенерирует новый вид класса, тогда как view будет генерировать от тега class.

+0

В обоих случаях у меня есть: 01-05 20: 08: 48.497: E/AndroidRuntime (3170): FATAL EXCEPTION: main' '01-05 20: 08: 48.497: E/AndroidRuntime (3170): java.lang.RuntimeException: не удается запустить Activity ComponentInfo {com.example.proj/com.example.proj.MainActivity}: android.view. InflateException: двоичная строка XML-файла # 10: ошибка раздувания класса com.example.proj.SampleView' '01-05 20: 08: 48.497: E/AndroidRuntime (3170): \t at android.app.ActivityThread.performLaunchActivity (ActivityThread .java: 2180) ' –

+0

ОК, я исправил это! Я добавил конструкторы 'public SampleView (контекст контекста)' и 'public SampleView (контекст контекста, AttributeSet attrs)'. Я понятия не имею, почему это работает. Большое спасибо! :) –

+1

Рад помочь .. Хотя я тоже не совсем уверен, я думал, что конструктор с defStyle вызывается при создании экземпляра из XML –

Смежные вопросы