Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung


Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!

extends view + onDraw() + listener

Das Thema "extends view + onDraw() + listener" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 18.05.2010, 22:14   #1 (permalink)
jim
Android-Hilfe.de Mitglied

Modell: eclipse android emulator

Registriert seit: 02.05.2010
Beiträge: 76
Abgegebene Danke: 15
Erhielt 0 Danke für 0 Beiträge
Standard extends view + onDraw() + listener

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
jim ist offline   Mit Zitat antworten
Alt 18.05.2010, 23:18   #2 (permalink)
Android Guru

Modell: T-Mobile G1, Nexus One, Samsung Galaxy Tab 10.1, Samsung Galaxy Nexus

Registriert seit: 04.05.2009
Beiträge: 1.461
Abgegebene Danke: 117
Erhielt 175 Danke für 165 Beiträge
Standard AW: extends view + onDraw() + listener

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.
the_alien ist offline   Mit Zitat antworten
Alt 19.05.2010, 00:52   #3 (permalink)
jim
Android-Hilfe.de Mitglied

Modell: eclipse android emulator

Registriert seit: 02.05.2010
Beiträge: 76
Abgegebene Danke: 15
Erhielt 0 Danke für 0 Beiträge
Standard AW: extends view + onDraw() + listener

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
jim ist offline   Mit Zitat antworten
Alt 19.05.2010, 01:19   #4 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.522
Abgegebene Danke: 73
Erhielt 495 Danke für 286 Beiträge
Standard AW: extends view + onDraw() + listener

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

Geändert von Fr4gg0r (19.05.2010 um 01:49 Uhr)
Fr4gg0r ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei Fr4gg0r für diesen Beitrag:
jim (19.05.2010)
Alt 19.05.2010, 10:03   #5 (permalink)
Android Guru

Modell: T-Mobile G1, Nexus One, Samsung Galaxy Tab 10.1, Samsung Galaxy Nexus

Registriert seit: 04.05.2009
Beiträge: 1.461
Abgegebene Danke: 117
Erhielt 175 Danke für 165 Beiträge
Standard AW: extends view + onDraw() + listener

Zitat:
Zitat von jim Beitrag anzeigen
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.
the_alien ist offline   Mit Zitat antworten
Alt 19.05.2010, 11:47   #6 (permalink)
jim
Android-Hilfe.de Mitglied

Modell: eclipse android emulator

Registriert seit: 02.05.2010
Beiträge: 76
Abgegebene Danke: 15
Erhielt 0 Danke für 0 Beiträge
Standard AW: extends view + onDraw() + listener

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.
Wieder das Gleiche!
Zitat:
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;
    }
 
    
}
jim ist offline   Mit Zitat antworten
Alt 19.05.2010, 12:03   #7 (permalink)
Android Guru

Modell: T-Mobile G1, Nexus One, Samsung Galaxy Tab 10.1, Samsung Galaxy Nexus

Registriert seit: 04.05.2009
Beiträge: 1.461
Abgegebene Danke: 117
Erhielt 175 Danke für 165 Beiträge
Standard AW: extends view + onDraw() + listener

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;
    }
 
    
}
the_alien ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei the_alien für diesen Beitrag:
jim (19.05.2010)
Alt 19.05.2010, 19:32   #8 (permalink)
jim
Android-Hilfe.de Mitglied

Modell: eclipse android emulator

Registriert seit: 02.05.2010
Beiträge: 76
Abgegebene Danke: 15
Erhielt 0 Danke für 0 Beiträge
Standard AW: extends view + onDraw() + listener

vielen Dank!! klappt jetzt wunderbar
jim ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Zoom in eigener View Webster Android App Entwicklung 2 14.05.2010 15:45
View repositionieren Kritzli Android App Entwicklung 0 23.02.2010 15:29
360° View Tim Posnien Android App Entwicklung 0 20.01.2010 15:46
Street View 2Stoned Sonstige Apps & Widgets 4 19.08.2009 12:28
onCenterChanged Listener?? siwica Android App Entwicklung 0 16.06.2009 21:16




Du liest gerade: "extends view + onDraw() + listener" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.