2014-01-05 15 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" /> 

OR:观点与 -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):致命例外:main' '01-05 20:08:48.497:E/AndroidRuntime(3170):java.lang.RuntimeException:无法启动活动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(Context context)'和'Public SampleView(Context context,AttributeSet attrs)'。我不知道,为什么它有效。非常感谢你! :) –

+1

很高兴帮助..虽然我不完全确定,但我认为使用defStyle的构造函数在从XML实例化时被调用 –