2012-08-17 3 views
2

J'ai un editText, et je veux que ce qui est tapé soit dessiné sur la toile qui a ma ressource appelée "ger". J'ai fait un code simple, mais ne le fais pas fonctionner. IDK quel est le problème, quand je le lance, il arrête de façon inattendueAndroid EditText sur toile

ceci est mon code de classe StartActivity public class activité {

/** Called when the activity is first created. */ 

static Bitmap bmp; 
static EditText et; 
static ImageView iv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    EditText et = (EditText) findViewById(R.id.editText1); 
    ImageView iv = (ImageView) findViewById(R.id.imageView1); 
    Bitmap bmp = Bitmap.createBitmap(et.getDrawingCache()); 
} 
public void onDraw (Canvas canvas){ 

    try { 
     canvas.drawColor (Color.BLACK) ; 
     Bitmap ab = BitmapFactory.decodeResource(getResources(),(R.drawable.ger)) ; 
     ab = bmp; 

     canvas.drawBitmap (ab , 0 , 0 , null) ; 

     Paint paint = new Paint(); 
     paint.setColor(Color.WHITE); 
     canvas.drawText(et.toString(),10,10,paint); 
     iv.setImageBitmap(bmp); 

    } catch (Exception e) { 
     e.printStackTrace () ; 
    } catch (Error e) { 
     e.printStackTrace () ; 
    } 

} 
} 

le logcat:

08-17 22:51:03.526: D/AndroidRuntime(509): Shutting down VM 
08-17 22:51:03.526: W/dalvikvm(509): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
08-17 22:51:03.547: E/AndroidRuntime(509): FATAL EXCEPTION: main 
08-17 22:51:03.547: E/AndroidRuntime(509): java.lang.RuntimeException: Unable to start activity ComponentInfo{example.edittext.com/example.edittext.com.StartActivity}: java.lang.NullPointerException 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.os.Looper.loop(Looper.java:123) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.main(ActivityThread.java:3683) 
08-17 22:51:03.547: E/AndroidRuntime(509): at java.lang.reflect.Method.invokeNative(Native Method) 
08-17 22:51:03.547: E/AndroidRuntime(509): at java.lang.reflect.Method.invoke(Method.java:507) 
08-17 22:51:03.547: E/AndroidRuntime(509): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
08-17 22:51:03.547: E/AndroidRuntime(509): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
08-17 22:51:03.547: E/AndroidRuntime(509): at dalvik.system.NativeStart.main(Native Method) 
08-17 22:51:03.547: E/AndroidRuntime(509): Caused by: java.lang.NullPointerException 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.graphics.Bitmap.createBitmap(Bitmap.java:367) 
08-17 22:51:03.547: E/AndroidRuntime(509): at example.edittext.com.StartActivity.onCreate(StartActivity.java:27) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
08-17 22:51:03.547: E/AndroidRuntime(509): ... 11 more 

xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" > 

     <requestFocus /> 
    </EditText> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.17" 
     android:src="@drawable/ger" /> 

</LinearLayout> 
+1

Pouvez-vous poster la sortie d'erreur LogCat, s'il vous plaît? En outre, pouvez-vous montrer le XML où 'ger' est? – Eric

+0

Pourquoi essayez-vous d'attraper une erreur? http://stackoverflow.com/questions/352780/when-to-catch-java-lang-error – slayton

+0

désolé, regardez la question mise à jour .. ill poster le xml maintenant –

Répondre

2

Le problème ici est que vous essayez de créez un Bitmap à partir d'un cache. Cela ne peut pas aller bien ... peut-

Ce que vous devez faire à la place est quelque chose comme ceci:

/** Called when the activity is first created. */ 

static Bitmap bmp; 
static EditText et; 
static ImageView iv; 
static Canvas ivCanvas; // We'll be using our own Canvas. 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    EditText et = (EditText) findViewById(R.id.editText1); 
    ImageView iv = (ImageView) findViewById(R.id.imageView1); 

    // Move this up to onCreate 
    Bitmap ab = BitmapFactory.decodeResource(getResources(),(R.drawable.ger)) ; 
    bmp = convertToMutable(ab); // Initialize it here with the contents of ab. This effectively clones it and makes it mutable. 
    ab = null; // Dispose of ab. 

    ivCanvas = new Canvas(bmp); // Create our Canvas! 

    // Add a TextWatcher 
    et.addTextChangedListener(new TextWatcher() { 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      updateCanvas(); // Call the canvas update 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 
     public void afterTextChanged(Editable s) { 
     } 
    }); 
} 
public void updateCanvas() { 
    ivCanvas.drawColor (Color.BLACK) ; 

    ivCanvas.drawBitmap (bmp , 0 , 0 , null) ; 

    Paint paint = new Paint(); 
    paint.setColor(Color.WHITE); 
    ivCanvas.drawText(et.getText().toString(),10,10,paint); 

    // Everything has been drawn to bmp, so we can set that here, now. 
    iv.setImageBitmap(bmp); 

    // Removed the "catch" blocks so you can actually know when you're getting errors! Feel free to re-add later. 
} 

Je l'ai commenté ce fond afin que vous puissiez comprendre les changements que j'ai fait. Je pense que d'autres changements sont nécessaires ici, mais cela devrait au moins fonctionner pour vous pour le moment.

EDIT:

J'ai converti le code à utiliser dans un TextWatcher. Vous pouvez en savoir plus sur l'implémentation de base à partir de this answer.

EDIT 2:

Vous aurez besoin de convertir le Bitmap à un bitmap "mutable" (modifiable). Vous pouvez utiliser le code trouvé dans this answer. J'ai ajouté un appel à cela ci-dessus.

+0

Merci Eric, mais je obtenir une erreur de .onDraw La méthode onDraw (Canvas) n'est pas définie pour le type Activité –

+0

Ouais, j'ai un peu pensé que vous le feriez. J'ai mis à jour ma réponse pour utiliser une implémentation de 'TextWatcher'. – Eric

+0

merci Eric, mais maintenant je suis en train de supprimer l'erreur d'annotations @override, btw accepted =) –