Add a button to View

百般思念 提交于 2019-12-23 20:15:52

问题


I'm drawing a graph then add some button/label/textbox for input data. But the button on main layout is't show up. how to add button to a View (Because i draw graph using canvas on a View)

here is draw canvas class

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); 
    }
}

this is main class

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;
    }
}

Fixed:

DrawCross class:

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);
    }
}

main class:

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>

Manifest

<?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>

and the 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


回答1:


I try your earlier DrawCross and it does what you want but it is a little bit ugly. You have to set the baseline to make it look nice

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>



回答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>

Create a lay out like this and set this as content for your Activity. Also

public class DrawCross extends View

Use View to extend your DrawCross. The yourPacakageName should be exactly the package name of your DrawCross.

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

change this to

<activity android:name=".MainActivity"


来源:https://stackoverflow.com/questions/16504243/add-a-button-to-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!