在View中添加一个按钮

时间:2013-05-12 04:36:30

标签: android button view android-ui

我正在绘制图形,然后为输入数据添加一些按钮/标签/文本框。但是主要布局上的按钮没有显示出来。如何向视图添加按钮(因为我在视图上使用画布绘制图形)

这里是绘制画布类

public class DrawCross extends View {
    Paint   paint   = new Paint();

    public DrawCross(Context context) {
        super(context);
        paint.setColor(Color.BLACK);
        Button btn = new Button(context);
    }

    @Override
    public void onDraw(Canvas canvas){
        canvas.drawLine(250, 450, 250, 20, paint);
        canvas.drawLine(245, 25, 250, 20, paint);
        canvas.drawLine(250, 20, 255, 25, paint);

        canvas.drawLine(20, 300, 400, 300, paint);
        canvas.drawLine(395, 295, 400, 300, paint);
        canvas.drawLine(400, 300, 395, 305, paint); 
    }
}

这是主要的课程

public class MainActivity extends Activity {
    DrawCross   drawView;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawView = new DrawCross(this);
        setContentView(drawView);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

修正:

DrawCross类:

public class DrawCross extends View {
    Paint   paint   = new Paint();

    public DrawCross(Context context) {
        super(context);
    }

    @Override
    public void onDraw(Canvas canvas){
        canvas.drawLine(250, 450, 250, 20, paint);
        canvas.drawLine(245, 25, 250, 20, paint);
        canvas.drawLine(250, 20, 255, 25, paint);
        canvas.drawLine(20, 300, 400, 300, paint);
        canvas.drawLine(395, 295, 400, 300, paint);
        canvas.drawLine(400, 300, 395, 305, paint);
    }
}

主要课程:

public class MainActivity extends Activity {
    DrawCross   drawView;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

activity_main layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="a" />

        <EditText
            android:layout_width="20dp"
            android:layout_height="wrap_content" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="draw" />

    </LinearLayout>
    <com.example.khibong.DrawCross
        android:id="@+id/myView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.khibong"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.khibong.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

和logcat:

05-12 12:56:16.831: E/Trace(1715): error opening trace file: No such file or directory (2)
05-12 12:56:16.841: D/AndroidRuntime(1715): Shutting down VM
05-12 12:56:16.841: W/dalvikvm(1715): threadid=1: thread exiting with uncaught exception (group=0xb3e28288)
05-12 12:56:16.841: E/AndroidRuntime(1715): FATAL EXCEPTION: main
05-12 12:56:16.841: E/AndroidRuntime(1715): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.khibong/com.example.khibong.MainActivity}: android.view.InflateException: Binary XML file line #31: Error inflating class com.example.khibong.DrawCross
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.os.Looper.loop(Looper.java:137)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.ActivityThread.main(ActivityThread.java:4745)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at java.lang.reflect.Method.invokeNative(Native Method)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at java.lang.reflect.Method.invoke(Method.java:511)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at dalvik.system.NativeStart.main(Native Method)
05-12 12:56:16.841: E/AndroidRuntime(1715): Caused by: android.view.InflateException: Binary XML file line #31: Error inflating class com.example.khibong.DrawCross
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.createView(LayoutInflater.java:596)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.Activity.setContentView(Activity.java:1867)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at com.example.khibong.MainActivity.onCreate(MainActivity.java:18)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.Activity.performCreate(Activity.java:5008)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
05-12 12:56:16.841: E/AndroidRuntime(1715):     ... 11 more
05-12 12:56:16.841: E/AndroidRuntime(1715): Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
05-12 12:56:16.841: E/AndroidRuntime(1715):     at java.lang.Class.getConstructorOrMethod(Class.java:460)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at java.lang.Class.getConstructor(Class.java:431)
05-12 12:56:16.841: E/AndroidRuntime(1715):     at android.view.LayoutInflater.createView(LayoutInflater.java:561)
05-12 12:56:16.841: E/AndroidRuntime(1715):     ... 22 more

enter image description here

2 个答案:

答案 0 :(得分:2)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="a" />

        <EditText
            android:layout_width="20dp"
            android:layout_height="wrap_content" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="draw" />
    </LinearLayout>

    <yourPacakageName.DrawCross
        android:id="@+id/myView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

创建这样的布局并将其设置为Activity的内容。还

public class DrawCross extends View

使用视图扩展您的DrawCross。 yourPacakageName应该是DrawCross的包名。

<activity android:name="com.example.khibong.MainActivity"

将此更改为

<activity android:name=".MainActivity"

答案 1 :(得分:2)

我尝试你早期的DrawCross,它可以做你想要的但是有点难看。您必须设置基线以使其看起来不错

public class MainActivity extends Activity {
DrawCross   drawView;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DrawCross drawCross = new DrawCross(this);
    LinearLayout layout1 = (LinearLayout) findViewById(R.id.drawcross);
    layout1.addView(drawCross);
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

XML

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="10"
android:orientation="vertical" >

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="label1" />

        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@id/textview1" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Draw" />

    </LinearLayout>

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="label2" />

        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="label3" />

        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <LinearLayout 
        android:id="@+id/drawcross"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="7"
        android:orientation="horizontal" >

    </LinearLayout>

</LinearLayout>