问题
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