extends view + onDraw() + listener

J

jim

Ambitioniertes Mitglied
0
Hallo liebes Forum,

leider komme ich gerade nicht weiter und hoffe Jemand kann mir weiter helfen.

Ich habe zwei Klassen, eine Klasse1 extend Activity und eine Klasse2 extends View. In der Klasse1 erstelle ich mir eine Instanz der Klasse2 und hänge diese im einem linearen layout dran.
Code:
  MyDrawableView  mCustomDrawableView = new MyDrawableView(this);
        ((LinearLayout)findViewById(R.id.layout3)).addView(mCustomDrawableView);
Ich versuche gerade in der onDraw() ein Wert eines textview aus dem Layout zu bekommen. Dabei stürzt der Emulator aber ab...
Code:
 @Override
    protected void onDraw(Canvas canvas)
    {
        ///getValue of textview
       velocityValue = (TextView)findViewById(R.id.EditTextValue);
       //_speed = Integer.parseInt(velocityValue.getText().toString());
        myImage.setBounds(x, y, x + width, y + height);
        x +=2; //x+=speed;


       // mDrawable.draw(canvas);
        //myImage.setBounds(x + _speed , y, x + width, y + height);
        myImage.draw(canvas);
        invalidate();
    }

Was mach falsch? bzw. kann ich nicht in der onDraw() Schleife(invalidate()) nicht auf das Layout zu greifen? bzw. welchen Weg könnte ich beschreiten.
LG Jim
 
Eigentlich sollte die Activity den Wert des TextViews an deinen eigenen View übergeben. Sprich Listener an den TextView und bei Änderungen an deinen MyDrawableView übergeben.
 
hallo, genau diesen Plan hatte ich vorher verfolgt.
mCustomDrawableView.setSpeed(velocity);

Den Listener habe ich wie folgt in der extends activity implementiert
Code:
      inputValue.setOnEditorActionListener(new OnEditorActionListener()
      {
         
          public boolean onEditorAction(TextView v, int actionId, KeyEventevent)
         {
             if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
              {
                
                  velocity = Integer.parseInt(inputValue.getText().toString());
                  ///set velocity to drawableObjekt
                  mCustomDrawableView.setSpeed(velocity);              
                  ///Textview for Inputvalue
                 TextView velocityValue = (TextView)findViewById(R.id.EditTextValue);
                  velocityValue.setText( velocity + "ms");
              }
              return false;
          }
      });
Weiterhin hatte ich eine Variable in der extends view -> _speed in welcher der Wert gespeichert und dann später darauf zugegriffen wird...

Bei der Variante wollte der Compiler das ich die velocity final mache. Liegt es daran das ich als Listener eine anonyme Adapterklasse benutze? Ist auch mein erster Einsatz mit Listener und Android und ich verstehe viele Sachen noch nicht. wie sollte es aussehen? bzw. wonach sollte ich suchen? LG TIM
 
Poste doch mal den Fehlercode...
(Logcat)

btw:
Wenn in dem EditText nichts drin ist, wirft das einen Fehler aus.
Man kann das umgehen indem man das mit einer try/catch Anweisung umgibt.

Integer.parseInt(velocityValue.getText().toString());
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: jim
jim schrieb:
Bei der Variante wollte der Compiler das ich die velocity final mache. Liegt es daran das ich als Listener eine anonyme Adapterklasse benutze? Ist auch mein erster Einsatz mit Listener und Android und ich verstehe viele Sachen noch nicht. wie sollte es aussehen? bzw. wonach sollte ich suchen? LG TIM
Das ist plain old Java!
Du kannst in einer anonymen Klasse nur auf final, Klassen- oder Objektvariablen zugreifen.
 
nächster Versuch,

laut dieser Seite gibt es drei Arten wie man Listener implementiert.
Implementing Listeners in your Android/Java application | Tseng's dev blog
Jetzt habe ich also die 2 Version mit implements OnEditorActionListener versucht. :mad:
Wieder das Gleiche!
Cannot refer to a non-final variable mCustomDrawableView inside an inner class defined in a different method
Was mach ich falsch wenn du sagst das dies nur bei anonymen Adapterklassen so wäre?

Ich stell hier mal den Code vor bevor ich die dritte Variante probiere.
Tut mir Leid wenn ich mich zu blöd anstellt, aber ich weis einfach nicht wie ich vorgehen soll.
Code:
package com.jb;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;

public class MyDrawableView extends View
{

        
        ///Textview for Inputvalue
        private TextView velocityValue;
        private Drawable myImage;
        private ShapeDrawable mDrawable;
        int x = 0;
        int y = 0;
        int width = 100;
        int height = 100;
        int _speed =2;
        EditText inputValue;    
        
        //////////////////////////////////////////////////////////////////////////////////////////   
        
    public MyDrawableView(Context context)
    {
        super(context );
        
        ///load picture
        Resources res = context.getResources();
        myImage = res.getDrawable(R.drawable.cabrio);
        myImage.setBounds(x, y, x + width, y + height);
        
        
//        mDrawable = new ShapeDrawable(new OvalShape());
//        mDrawable.setBounds(x, y, x + width, y + height);
//        mDrawable.getPaint().setColor(0xFF0000FF);
        
        
    }
    //////////////////////////////////////////////////////////////////////////////////////////
    @Override
    public void onDraw(Canvas canvas)
    {    
        
        
         ///moving
        x += _speed;
        if(x>=100 || x < 0)
            _speed *= -1;
               
        myImage.setBounds(x, y, x + width, y + height);
        myImage.draw(canvas);
        
        invalidate();
          
    }
    //////////////////////////////////////////////////////////////////////////////////////////
    public void setSpeed(int speed)
    {
        _speed =speed;
    }
}
Code:
package com.jb;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText; 
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.view.KeyEvent;
import android.view.View;
import android.os.Bundle;







public class  gravity_Game extends Activity implements OnEditorActionListener
{
    
    // Declare our Views, so we can access them later
    private EditText inputValuefromEdittext;
    

    /////////////////////////////////////////////////////////////////////////////////////////////
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ///    
        inputValuefromEdittext = (EditText)findViewById(R.id.EditText01);
        
         ///add View to activity View
        MyDrawableView  mCustomDrawableView = new MyDrawableView(this);
        ((LinearLayout)findViewById(R.id.layout3)).addView(mCustomDrawableView); 
     ////////////////////////////////////////////////////////////////////////////////////////////   
     // Set Click Listener
        inputValuefromEdittext.setOnEditorActionListener(new OnEditorActionListener()
        {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
          {
              if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
              {
              
                  //speed = getValue and cast to double
                  int speed = Integer.parseInt(inputValuefromEdittext.getText().toString());
 //error->        mCustomDrawableView.setSpeed(speed);
                  ///Textview for Inputvalue
                  TextView velocityValue = (TextView)findViewById(R.id.EditTextValue);
                  velocityValue.setText( speed + "ms");
              }
              return false;
          }
        }); 
            
     //////////////////////////////////////////////////////////////////////////////////////////////   
     ///spinner
        Spinner s1 = (Spinner)findViewById(R.id.Planets);
        ArrayAdapter<CharSequence> adapter =
        ArrayAdapter.createFromResource(this,R.array.Planeten, android.R.layout.simple_spinner_item);
        s1.setAdapter(adapter); 
     /////////////////////////////////////////////////////////////////////////////////////////////
      
     
    }


    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // TODO Auto-generated method stub
        return false;
    }
 
    
}
 
Code:
 ////////////////////////////////////////////////////////////////////////////////////////////   
     // Set Click Listener
        inputValuefromEdittext.setOnEditorActionListener(new OnEditorActionListener()
        {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
          {
              if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
              {
              
                  //speed = getValue and cast to double
                  int speed = Integer.parseInt(inputValuefromEdittext.getText().toString());
 //error->        mCustomDrawableView.setSpeed(speed);
                  ///Textview for Inputvalue
                  TextView velocityValue = (TextView)findViewById(R.id.EditTextValue);
                  velocityValue.setText( speed + "ms");
              }
              return false;
          }
        });
Da hast du doch deine anonyme Klasse...
Richtig wäre es mit implements so:
Code:
package com.jb;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText; 
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.view.KeyEvent;
import android.view.View;
import android.os.Bundle;







public class  gravity_Game extends Activity implements OnEditorActionListener
{
    
    // Declare our Views, so we can access them later
    private EditText inputValuefromEdittext;
    

    /////////////////////////////////////////////////////////////////////////////////////////////
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ///    
        inputValuefromEdittext = (EditText)findViewById(R.id.EditText01);
        
         ///add View to activity View
        MyDrawableView  mCustomDrawableView = new MyDrawableView(this);
        ((LinearLayout)findViewById(R.id.layout3)).addView(mCustomDrawableView); 
     ////////////////////////////////////////////////////////////////////////////////////////////   
     // Set Click Listener
        inputValuefromEdittext.setOnEditorActionListener(this); 
            
     //////////////////////////////////////////////////////////////////////////////////////////////   
     ///spinner
        Spinner s1 = (Spinner)findViewById(R.id.Planets);
        ArrayAdapter<CharSequence> adapter =
        ArrayAdapter.createFromResource(this,R.array.Planeten, android.R.layout.simple_spinner_item);
        s1.setAdapter(adapter); 
     /////////////////////////////////////////////////////////////////////////////////////////////
      
     
    }


    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        
if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
              {
              
                  //speed = getValue and cast to double
                  int speed = Integer.parseInt(inputValuefromEdittext.getText().toString());
 //error->        mCustomDrawableView.setSpeed(speed);
                  ///Textview for Inputvalue
                  TextView velocityValue = (TextView)findViewById(R.id.EditTextValue);
                  velocityValue.setText( speed + "ms");
              }
              return false;
    }
 
    
}
 
  • Danke
Reaktionen: jim
vielen Dank!! klappt jetzt wunderbar
 

Ähnliche Themen

Jansenwilson
Antworten
1
Aufrufe
690
Mazuch
Mazuch
A
Antworten
10
Aufrufe
1.021
swa00
swa00
P
Antworten
0
Aufrufe
554
Pascppal
P
Zurück
Oben Unten