1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

extends view + onDraw() + listener

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von jim, 18.05.2010.

  1. jim, 18.05.2010 #1
    jim

    jim Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    0
    Registriert seit:
    02.05.2010
    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
     
  2. the_alien, 18.05.2010 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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.
     
  3. jim, 19.05.2010 #3
    jim

    jim Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    0
    Registriert seit:
    02.05.2010
    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
     
  4. Fr4gg0r, 19.05.2010 #4
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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: 19.05.2010
    jim bedankt sich.
  5. the_alien, 19.05.2010 #5
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Das ist plain old Java!
    Du kannst in einer anonymen Klasse nur auf final, Klassen- oder Objektvariablen zugreifen.
     
  6. jim, 19.05.2010 #6
    jim

    jim Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    0
    Registriert seit:
    02.05.2010
    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!
    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;
        }
     
        
    }
    
     
  7. the_alien, 19.05.2010 #7
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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;
        }
     
        
    }
    
     
    jim bedankt sich.
  8. jim, 19.05.2010 #8
    jim

    jim Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    0
    Registriert seit:
    02.05.2010
    vielen Dank!! klappt jetzt wunderbar
     

Diese Seite empfehlen