在View中添加一个按钮(Add a button to View)

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

这是绘制画布类

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布局:

<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

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

最满意答案

我尝试你早先的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>

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>

更多推荐