1. afroasiate, 15.11.2010 #1
    afroasiate

    afroasiate Threadstarter Neuer Benutzer

    Hallo,

    ich möchte bei mir im Quellcode etwas verkürzen. Ich habe im Moment etwa 30 ImageButtons welche ich für ein Spielfeld brauche, dazu muss jedoch jeder Button Initialisiert werden.

    Code:
     public void onCreate(Bundle savedInstanceState) {
    
        	super.onCreate(savedInstanceState);
            setContentView(R.layout.setzen);
            
            zelle00 = (ImageButton)this.findViewById(R.id.zelle00);
            zelle00.setOnClickListener(this);
    
            zelle01 = (ImageButton)this.findViewById(R.id.zelle00);
            zelle01.setOnClickListener(this);
            .
            .
            .
    
    
    Jetzt dachte ich daran das Initialisieren zu vereinfachen bzw. zu verkürzen.
    Ich dachte an folgendes:

    Code:
    
        	buttonlist= new ImageButton[]{zelle00,zelle10,zelle20,zelle30,zelle40,zelle01,zelle11,zelle21,zelle31,zelle41,zelle51,zelle02,zelle12,zelle22,zelle32,zelle42,zelle52,zelle03,zelle13,zelle23,zelle33,zelle43,zelle53,zelle04,zelle14,zelle24,zelle34,zelle44,zelle54};
    
           for(int i=0; i<30;i++) {
            	buttonlist[i]=(ImageButton)this.findViewById(R.id.xxxx]);
           }
    
    
    
    Nur was schreibe ich hinten bei R.id.????? Die ID´s in der XML Datei heissen genauso die Bezeichnungen im buttonlist Array. R.id erwartet eine Variable vom Typ int.


    Kann mir wer helfen?


    cu
    afro
     
  2. funcoder, 15.11.2010 #2
    funcoder

    funcoder Erfahrener Benutzer

    Mhh, das einzige was mir jetzt einfällt, wäre einen extra Array für die Ids zu erstellen also:

    int idOfObjects[] = new int[10];
    idOfObjects[0] = R.id.zelle0;

    und dann entsprechend:

    buttonlist=(ImageButton)this.findViewById(idOfObjects);

    Denn jedes XML Element, besitzt nur eine Variable vom Typ int, die genauso heißt, allerdings "hintenrum" als eindeutigen/weiterlaufenden Integer verarbeitet wird.

    Was besseres fällt mir jetzt auch nicht ein :winki:
     
  3. DieGoldeneMitte, 15.11.2010 #3
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Man muss die ids in ein array tun und kann dann ein passendes ImageButton-array dazu aufbauen:

    Code:
    static init ids[] = new int[] { R.id.id0, R.id.id1, ... };
    ...
    ImageButton[] buttons = new ImageButton[ids.length];
    for( int i=0; i<ids.length; i++ ) {
      buttons[i] = (ImageButton) findViewById( ids[i] );
      buttons[i].setOnClickListener(this);
    }
    
    Das R.id könntest Du sogar mit einem static import loswerden - das würde ich aber nicht tun, weil Dir das deinen Namespace ver"hurt". ;-)
     
    Zuletzt bearbeitet: 15.11.2010
  4. afroasiate, 15.11.2010 #4
    afroasiate

    afroasiate Threadstarter Neuer Benutzer

    Danke an euch beide mit Variante 2 bin ich weiter gekommen!!!! Ihr habt mir super geholfen!
     
  5. Fr4gg0r, 15.11.2010 #5
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Sofern du die Buttons namentlich durchnummeriert hast, müsste das auch komplett dynamisch über Reflection machbar sein. :w00t00:

    Code:
    final Class c = R.id.class;
    Field[] fields = c.getFields();
    ArrayList<Integer> ids = new ArrayList<Integer>();
    for(Field f: fields){         
                   if(f.getName().startsWith("layout_1_button_"))ids.add(f.getInt(null));
    }
    Und dann
    Code:
    int count = ids.size();
    ImageButton[] buttons = new ImageButton[count];
    for(int i = 0; i<count; i++) { //angeblich schneller als erweiterte for
      buttons[i] = (ImageButton) findViewById( ids.get(i) );
      buttons[i].setOnClickListener(this);
    }
    
     
    Zuletzt bearbeitet: 15.11.2010