onClick Listener mit imageviews

  • Antworten:8
Emanuel Gostner
  • Forum-Beiträge: 5

08.03.2014, 14:13:34 via Website

Hallo, also ich hab eine activity mit einem Button und einem ImageView dass nachdem die App gestartet wurden erstellt wird. Nun möchte ich mit dem Listener ein Click Ereignis für den Button und der Image View machen und hab folgendes bisher: (wurms ist der ImageView, buttonsettings der button)

@Override
public void onClick(View view) {
switch(view.getId()){
case wurms:
break;
case R.id.buttonsettings:
break;
}
}

Das Problem hier ist dass wurms rot unterstrichen wird und anscheinend ein int sein muss. Habt ihr eine Idee?

mfg
Manu

Antworten
Phil G.
  • Forum-Beiträge: 86

08.03.2014, 15:09:45 via Website

Naja einfach eine ID für dein Imageview im Layout setzen und die dann dort ebenfalls einfügen.

Antworten
Michele
  • Forum-Beiträge: 1.525

08.03.2014, 16:34:03 via Website

Hallo.

Wie Phil schon sagte, ID von deinem ImageView benutzen/setzen.
Wenn deine ImageView keine ID hat, dann kannst du sie ja hinzufügen/ändern.



LG

Antworten
Emanuel Gostner
  • Forum-Beiträge: 5

08.03.2014, 19:03:03 via Website

Okay ich hab eine ID per setTag dem ImageView gegeben, aber die Image View reagiert nicht bei z.B

@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.wurmid:
board.removeView(wurms);
break;
case R.id.buttonsettings:
settings();
break;
}
}

Verschwindet die imageView nicht! :(

— geändert am 08.03.2014, 19:03:47

Antworten
Phil G.
  • Forum-Beiträge: 86

08.03.2014, 22:03:37 via Website

Hmmm da bringst du gerade etwas durcheinander, warum benutzt du setTag ??? Tag hat rein gar nix mit der ID zu tun.
Die ID ist eine nummerische Zuweisung einer Resource (deswegen auch int).

D.h. du musst dem Imageview eine ID in deinem XML Layout vergeben , ala

1<ImageView
2 android:id="@+id/wurmid"
3...
4hier der Rest
5...
6
7 />

Dann kannst du auch per

case R.id.wurmid:

darauf zugreifen.
Natürlich kannst du auch eine ID per SetID vergeben, davon würde ich aber absehen. Wenn du einmal Sachen im XML Layout definierst und dann wieder im Code ist das unsauber und führt häufig zu Problemen. (Duplikate ect pp)


PS:

aber ein clickable = true hast du auch gesetzt ???

Und wie setzt du eigentlich den OnClicklistner für die Imageview, wenn er bislang keine ID hatte ???

du brauchst ja in deinem oncreate ja mindesten noch ein.

Imageview wurm = (ImageView) findeViewbyID(R.id.wurmid);
wurm.setOnClicklistner(this); // Ich gehe davon aus, das du eine onClickMethode in der Activity hast und die Activity onClick implemeniert.

bla blup Activity implements View.OnClickListner

— geändert am 08.03.2014, 22:07:14

Antworten
Michele
  • Forum-Beiträge: 1.525

08.03.2014, 22:06:08 via Website

Hallo.

Am besten du zeigst uns deinen ganzen Code mal. :D


LG

Antworten
Emanuel Gostner
  • Forum-Beiträge: 5

09.03.2014, 14:34:06 via Website

Okay also hier mal der ganze code:
public class Arena extends ActionBarActivity implements View.OnClickListener, Runnable {

private ViewGroup board;
float massstab;
private Random randomgenerator = new Random();
private Handler handler = new Handler();
ImageView wurms;






@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.arena_activity);
Button settings = (Button)findViewById(R.id.buttonsettings);
settings.setOnClickListener(this);
massstab = getResources().getDisplayMetrics().density;
board = (ViewGroup)findViewById(R.id.board);
startGame();
}

@Override
public void run() {
createWorm();
}

private void startGame(){
handler.postDelayed(this, 5000);

}
private void createWorm() {

int breite = board.getWidth();
int hoehe = board.getHeight();
int wurms_breite = (int) Math.round(massstab*70);
int wurms_hoehe = (int) Math.round(massstab*70);
int links = randomgenerator.nextInt(breite - wurms_breite );
int oben = randomgenerator.nextInt(hoehe - wurms_hoehe);

wurms = new ImageView(this);
wurms.setImageResource(R.drawable.wurms);
wurms.setOnClickListener(this);

wurms.setId(1);

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(wurms_breite, wurms_hoehe);
params.leftMargin = links;
params.topMargin = oben;
params.gravity = Gravity.TOP + Gravity.LEFT;

board.addView(wurms, params);

startGame();

}




@Override
public void onClick(View view) {

switch(view.getId()){
case R.id.1: <hier weiß ich nicht weiter
board.removeView(wurms);
break;
case R.id.buttonsettings:
settings();
break;
}

wenn ich also einen der ImageViews die in createworm() erstellt habe anklicke soll der verschwinden. wenn ich auf den button settings klicke soll die methode settings aufgeruft werden, klingt irgendwie simpel, bekomms aber nicht hin.

Antworten
Phil G.
  • Forum-Beiträge: 86

09.03.2014, 16:39:25 via Website

Ok, dein Code macht schon mal klar, du setzt die ID nicht im Layout, sondern dynamisch im Code. Also vergessen wir den XML Teil.

Wenn du nummerisch als ID eine 1 vergibst, dann musst du auch auf 1 testen. (also das R.id. bezieht sich immer auf Resourcen welche automatisch von Android beim Compilieren generiert werden = Teile des Layouts, ImageResourcen , StringResourcen ect pp = d.h. weglassen)


case 1:
ect pp.

Antworten
Emanuel Gostner
  • Forum-Beiträge: 5

10.03.2014, 11:00:12 via Website

okay mit case 1: wird zwar kein fehler mehr angezeigt, aber es wird immer nur die letzt erstellte imageview beim draufklicken gelöscht. Verteile ich nun für für jede image view eine id, wird bei case a: angezeigt dass der wert konstant bleiben muss. :/

Hier meine methode für die id verteilung:

/*public void IDs(){
int number = 0;
while(number < board.getChildCount()){
ImageView wurmsid = (ImageView) board.getChildAt(number);
wurmsid.setId(number);
number++;
a = wurmsid.getId();
}
}*/

Antworten