2013-05-12 107 views
3

我正在繪製圖形,然後爲輸入數據添加一些按鈕/標籤/文本框。但主佈局上的按鈕不顯示。如何添加按鈕視圖(因爲我畫使用上查看畫布圖)添加一個按鈕來查看

這裏是畫油畫類

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

主類:

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 

enter image description here

+0

@Triode我試過延伸的RelativeLayout爲DrawCross類,但的RelativeLayout的onDraw有不喜歡觀的onDraw。當我改變爲RelativeLayout時,我繪製的每件東西都消失了。如何解決它? – Dolphin 2013-05-12 04:54:59

+0

調用Super.Ondraw(); – Triode 2013-05-12 05:04:25

+0

@Triode我已經添加了super.onDraw,但繪製仍然沒有顯示出來。我在帖子上發表了我的固定代碼。有什麼不對的嗎 ?? – Dolphin 2013-05-12 05:16:28

回答

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> 
+0

好的,明確的答案。真的很感激它。甚至很難甚至搜索這個答案 - 以編程繪製的元素和佈局元素的混合視圖,並且你非常簡潔明瞭地解釋了答案。 – raddevus 2016-06-14 20:15:58

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> 

創建一個這樣的佈局並將其設置爲您的活動的內容。另外

public class DrawCross extends View 

使用視圖來擴展您的DrawCross。 yourPacakageName應該是您的DrawCross的包名稱。

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

改變這

<activity android:name=".MainActivity"