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

Custom Buttons in GridView proportional anpassen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von phiLue, 07.12.2011.

  1. phiLue, 07.12.2011 #1
    phiLue

    phiLue Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    22.11.2011
    Guten Abend liebe Android-Gemeinde,

    ich habe folgendes problem. Nämlich möchte ich Buttons in einen GridView laden, was auch wunderbar funktioniert. Im GridView kann ich ja nun die Breite der Spalten eingeben mit "Column width".

    Den Buttons gebe ich immer einen Background mit, welcher ein Selector ist. Dieser Selector enthählt Grafiken für den Button, welche nur proportional skalliert werden dürfen, da diese sonst verzerren.

    Wie ist das möglich? Ich hab schon eine Methode zum skallieren von Bildern, aber das funktioniert mit XML Dateien (selector) nicht. =/

    Ich möchte letzendlich wenn ich den Button mit dem Selector in den GridView einfüge, und dieser in der Breite gestreckt bzw. gestaucht wird, das dies in der Höhe auch automatisch passiert.

    Weiß hier vielleicht jemand was man da machen kann?
     
  2. swordi, 07.12.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hmm so ganz weiß ich nicht, was dein problem ist, aber ich würde mal in richtung 9patch schauen.

    kennst du das?
     
  3. phiLue, 07.12.2011 #3
    phiLue

    phiLue Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    22.11.2011
    An sich kein schlechter Gedanke, nutz ich sonst auch überall wo es möglich ist und Sinn macht, aber hier geht dies leider nicht.

    Sagen wir mein Bild ist jetzt 144x180 Pixel groß mit 240 DPI. Im GridView soll die breite einer Spalte 90 betragen, was auch wunderbar funktioniert. Allerdings wird das Bild nun 90x180 dargestellt, und das ist natürlich dann völlig verzerrt.

    Wie ich es im Sourcecode verkleinern kann weiß ich leider nicht, da es sich hier nicht direkt um ein png handelt, sondern um einen Selector(xml), welche die png benutzt.

    //Edit:
    Letzendlich muss es keine größe von 90sp sein. Schöner wäre es ich könnte einfach sagen pro Reihe 3 Buttons und er würde es anhand der Bildschirmgröße dann skallieren.
     
    Zuletzt bearbeitet: 07.12.2011
  4. swordi, 07.12.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    naja mit layout weight kannst du das leicht bestimmen
     
  5. phiLue, 07.12.2011 #5
    phiLue

    phiLue Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    22.11.2011
    Hab danach gesucht, aber leider hat GridView.LayoutParams kein weight.
    Ich poste einfach mal den Quellcode den ich bis jetzt habe...

    Hier die XML Datei in der sich auch der GridView befindet:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:background="#FFFF">
      
          <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:background="@drawable/kopf_verlauf" android:layout_height="wrap_content" android:id="@+id/headerLayout">
        <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:src="@drawable/logo" android:layout_width="fill_parent" android:layout_marginTop="20sp"></ImageView>
        <ui.widgets.menu.MenuOrangeButton android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/menuTopOrange" android:layout_marginBottom="5sp"></ui.widgets.menu.MenuOrangeButton>
            
        </LinearLayout>
        
        <RelativeLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingBottom="10sp" android:layout_below="@+id/headerLayout" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:id="@+id/contentLayout">
              
              <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent"
                android:numColumns="auto_fit"
                android:stretchMode="spacingWidth"
                android:gravity="center"
                android:id="@+id/uebersichtGridView" android:verticalSpacing="3sp" android:horizontalSpacing="3sp" android:drawingCacheQuality="high" android:columnWidth="90sp"/>
              
          </RelativeLayout>
          <include android:id="@+id/slidingMenu" layout="@layout/sliding_menu_drawer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" />
    
        
    </RelativeLayout>
    
    Und hier der BaseAdapter den ich überschrieben hab und dem GridView hinzugefügt habe, wobei die ResourceID der Selector-XML in this.h.getGtList().get(position).getSelectorResID() steht:
    Code:
    public class UebersichtGridViewAdapter extends BaseAdapter {
    
        private Context mContext;
        private Haendler h;
        
        
        public UebersichtGridViewAdapter(Context c, Haendler h) {
            this.mContext = c;
            this.h = h;
        }
        
        @Override
        public int getCount() {
            return h.getGtList().size();
    
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return h.getGtList().get(position);
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public View getView(final int position, final View convertView, ViewGroup parent) {
               Button b = new Button(this.mContext);
               
    
            
            if(position <= h.getGtList().size()) {
                GridView.LayoutParams lp = new GridView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                b.setLayoutParams(lp);
                
                
                
                b.setBackgroundResource(this.h.getGtList().get(position).getSelectorResID());    
            
                b.setFocusable(false);
                b.setFocusableInTouchMode(false);
                b.setClickable(true);
    
                
            } else {
                // TODO: Blanko-Button without function
            }
            
            return b;
        }
    
    
    }
    
    
    Und so wird das ganze initialisiert:
    Code:
    getHaendler().setGtList((ArrayList<Typ>) result);
                    UebersichtGridViewAdapter adapter = new UebersichtGridViewAdapter(view, getHaendler());
                    
                    view.getContentGridView().setAdapter(adapter);
    Ich hoffe es wird jetzt ein bisschen klarer was ich möchte. :-(
     
    Zuletzt bearbeitet: 08.12.2011

Diese Seite empfehlen