Många Button till en onClickListener, hur veta vilken?

Diskussion i 'Frågor, support och diskussion' startad av cray, 23 mar 2011.

  1. cray

    cray Kid Droid Medlem

    Blev medlem:
    15 dec 2010
    Inlägg:
    63
    Mottagna gillanden:
    12

    MINA ENHETER

    Hej!

    Jag har ett GUI med många knappar och alla går till samma onClickListener. Jag hade tänkt switcha på inkommande View för att ta reda på vilken knapp som signalerade men jag märkte att i Java kan man inte switcha så vilt man kan i C++ ;).

    Några tips på hur man kan styra upp det annars? Det känns inget kul att ha massa if-satser även om det funkar.
     
  2. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 394
    Mottagna gillanden:
    2 134

    MINA ENHETER

    switcha på view.getID() så jämför du det med id:t som du har på de olika knapparna.

    case R.id.knapp1:

    osv

    Går inte det?
     
    cray gillar detta.
  3. cray

    cray Kid Droid Medlem

    Blev medlem:
    15 dec 2010
    Inlägg:
    63
    Mottagna gillanden:
    12

    MINA ENHETER

    Perfekt! Jag missade att den fanns, tack!
     
  4. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    Eller så har du en anonym lyssnare per knapp, skapar en enum och skickar in ett annorlunda enum-värde per lyssnare/knapp till en annan metod istället.
    Då får du din trevliga switch-sats.
    iofs ett par (många?) anonyma lyssnare men det skadar inte direkt.
     
  5. cray

    cray Kid Droid Medlem

    Blev medlem:
    15 dec 2010
    Inlägg:
    63
    Mottagna gillanden:
    12

    MINA ENHETER

    Problemet är att jag inte vill ha massa onClickListener utan jag vill centrera alla knapptryck till en. Tack iaf.
     
  6. foobar17

    foobar17 Kid Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    56
    Mottagna gillanden:
    11

    MINA ENHETER

    >>Problemet är att jag inte vill ha massa onClickListener

    Det där är mindre välbetänkt, eftersom i takt med att du har fler knappar får du mer komplex hantering i din stora handler.

    Att ha många inre klasser blir å andra sidan rörigt det med. Personligen använder jag alltid XML attributet onClick och en motsvarande metod void doit(View v).

    Layout XML:
    PHP:
    <Button . . . android:onClick="doit" . . . />
    Activity:
    Kod:
    void doit(View v) {. . .}
    Pss har man inga störande inre klasser och inte heller en"gigantisk" switch sats. Det blir enkelt att bygga ut med flera knappar och ändra allt eftersom.
     
  7. cray

    cray Kid Droid Medlem

    Blev medlem:
    15 dec 2010
    Inlägg:
    63
    Mottagna gillanden:
    12

    MINA ENHETER

    Switch-satsen blir ju kanske stor men den blir ju inte komplex, jag tycker man vinner mer med att inte ha massa inre klasser.

    Hursomhelst så verkar din metod väldigt bra och framför allt lättunderhållen. Ska testas ikväll! :)
     
  8. KaptenKaffe

    KaptenKaffe Baby Droid Medlem

    Blev medlem:
    8 dec 2010
    Inlägg:
    22
    Mottagna gillanden:
    1

    MINA ENHETER

    Jag har använt som föreslaget ovan. Tog ut lite snabb exempelkod för att illustrera principen för andra.

    Kod:
    	public ImageButton imageButton1;
    	public ImageButton imageButton2;
    	public ImageButton imageButton3;
    	public ImageButton imageButton4;
    	public ImageButton imageButton5;
    
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.bla);
    
    		MyOnClickListener myOnClickListener = new MyOnClickListener();
    
    		imageButton1 = (ImageButton) findViewById(R.id.imageButton1);
    		imageButton2 = (ImageButton) findViewById(R.id.imageButton2);
    		imageButton3 = (ImageButton) findViewById(R.id.imageButton3);
    		imageButton4 = (ImageButton) findViewById(R.id.imageButton4);
    		imageButton5 = (ImageButton) findViewById(R.id.imageButton5);
    
    		imageButton1.setOnClickListener(myOnClickListener);
    		imageButton2.setOnClickListener(myOnClickListener);
    		imageButton3.setOnClickListener(myOnClickListener);
    		imageButton4.setOnClickListener(myOnClickListener);
    		imageButton5.setOnClickListener(myOnClickListener);
    	}
    
    
    
    	private final class MyOnClickListener implements OnClickListener {
    
    		@Override
    		public void onClick(View view) {
    
    			switch (view.getId()) {
    			case (R.id.imageButton1): {
    				doSomething(1);
    				break;
    			}
    			case (R.id.imageButton2): {
    				doSomething(2);
    				break;
    			}
    			case (R.id.imageButton3): {
    				doSomething(3);
    				break;
    			}
    			case (R.id.imageButton4): {
    				doSomething(4);
    				break;
    			}
    			case (R.id.imageButton5): {
    				doSomething(5);
    				break;
    			}
    			}
    		}
    	}
     
  9. cray

    cray Kid Droid Medlem

    Blev medlem:
    15 dec 2010
    Inlägg:
    63
    Mottagna gillanden:
    12

    MINA ENHETER

    Det funkade ju bra :). En nackdel bara och det var ett det kördes ingen koll på om funktionen som sattes i android:onClick fanns utan det small i run-time. Men lite koll får man ju ha själv :).