2013-05-12 4 views
3

Je dessine un graphique puis j'ajoute un bouton/étiquette/zone de texte pour les données d'entrée. Mais le bouton sur la disposition principale n'apparaît pas. comment ajouter le bouton à une vue (Parce que je dessine le graphique en utilisant la toile sur une vue)Ajouter un bouton pour voir

ici est dessiner la toile classe

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

c'est la principale classe

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

fixe:

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

classe principale:

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 mise en page:

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

et 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 J'ai essayé étend RelativeLayout pour la classe DrawCross mais onDraw de RelativeLayout n'aime pas onDraw de vue. Quand je suis passé à RelativeLayout, tout ce que je dessine disparaît. comment le réparer? – Dolphin

+0

appel Super.Ondraw(); – Triode

+0

@Triode J'ai ajouté super.onDraw mais le tirage n'est toujours pas visible. J'ai mis mon code fixe sur poste. Y a-t-il quelque chose qui ne va pas ?? – Dolphin

Répondre

2

J'essaie votre plus tôt DrawCross et il fait ce que vous voulez, mais il est un peu laid. Vous devez définir la ligne de base pour le faire paraître belle

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

Grande, réponse claire. J'apprécie beaucoup. Il était difficile de même chercher cette réponse - une vue hybride avec des éléments et des éléments de mise en page programmés et vous avez expliqué la réponse très succinctement et clairement. – raddevus

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> 

Créez une disposition comme celle-ci et définissez-la comme contenu pour votre activité. Également

public class DrawCross extends View 

Utilisez la vue pour étendre votre DrawCross. Le yourPacakageName devrait être exactement le nom du paquet de votre DrawCross.

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

changement à ce

<activity android:name=".MainActivity" 
Questions connexes