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

Layoutproblem

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Gibbsnich, 20.09.2011.

  1. Gibbsnich, 20.09.2011 #1
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Hallo,

    ich erzeuge in meiner App Labels, Eingabefelder und Buttons und das in unterschiedlichen Mengen. Um Objekte in einer Reihe plazieren zu können, habe ich das auf einem TableLayout gemacht.

    Dazu kommt noch die Anforderung, dass oben eine Gallery steht und unten Buttons angezeigt werden sollen.

    Aussehen solld as ganze dann ungefähr so:
    [​IMG]

    Wobei Gallery und Buttonbereich zur Seite scrollen sollen und der Rest nach unten.

    Meine Layoutdatei hat zur Zeit diesen Inhalt:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/basisscrollview"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/basislayout"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:stretchColumns="0, 1, 2,3">
    
            <Gallery xmlns:android="http://schemas.android.com/apk/res/android" 
                android:id="@+id/gallery"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:longClickable="true"
                android:unselectedAlpha="0.6"
            />
            <TextView  xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/titelzeile"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:textStyle="bold"> 
            </TextView>
            <TextView  xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/no_connection"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:text="@string/noConnection"
                android:visibility="invisible"
                android:textStyle="bold"> 
            </TextView>
            <WebView   xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/webview"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
            </WebView>
    
            <TableRow>
            </TableRow>
    </TableLayout>
        
    </ScrollView>
    Das klappt soweit, hat nur den Haken, dass die Buttons bei langen Dialogen nach unten verschwinden und hochgescrollt werden muss, aber damit könnte ich leben.

    Nun muss aber noch eine schnelle Liste mit SectionIndexer dazu und damit habe ich ein Problem. So wie ich das sehe, brauche ich dafür zwingend ein LinearLayout, aber ich bekomme das nicht vernünftig integriert.

    Ich habe alles mögliche probiert und bekomme meist einen Absturz und manchmal die indizierte Liste in einem sehr schmalen Bereich und der Rest des Displays bleibt leer.


    Kann mir einer Starthilfe geben?
    In welcher Reihenfolge müssen die Layouts in der Formatdatei stehen?
     
  2. v Ralle v, 20.09.2011 #2
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Ich hätte es anders gelöst:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <Button
            android:layout_height="wrap_content"
            android:text="Button"
            android:id="@+id/button2"
            android:layout_width="fill_parent"></Button>
        <ListView
            android:id="@+id/listView1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"></ListView>
        <Button
            android:text="Button"
            android:id="@+id/button1"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"></Button>
    
    </LinearLayout>
    Die Button kannst du natürlich einfach ersetzen und andere Views einfügen. Beachte halt das weight Attribut.

    So wie ich dein Vorhaben verstanden habe, machst du dir das Leben zu schwer. Ich hoffe ich konnte helfen ;-)
     

    Anhänge:

  3. Gibbsnich, 22.09.2011 #3
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Hallo v Ralle v,

    Danke, das bringt mich schon einmal einein großen Schritt weiter,
    ABER:

    1. meine Dialoge auch länger werden können, muss ich scrollen können und habe daher eine ScrollView um alles herum gelegt. Das ist so ok, oder?

    2. Über den Button unten links schalte ich jetzt um zwischen TableLayout (Für Dialoge und mehrspaltige Liste) und der ListView (für die Fastscroll-Liste mit Indexer). Das Umschalten ist ok, aber wie kann ich die Größe korrigieren?

    Es starten jetzt beide Views sichtbar und das TableLayout nimmt sich soviel Platz, wie es gerade benötigt. Dementsprechend klein wird die ListView.
    Beim Umschalten ändere ich mit SetVsibility() die Sichtbarkeit, aber die Größen bleiben unverändert.
    Wie kann ich da eingreifen?

    Oder ist mein Ansatz falsch?? :sad:

    Hier das Layout:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/basisscrollview" android:orientation="vertical"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical" android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Gallery xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/gallery" android:layout_width="fill_parent"
                android:layout_height="32px" android:longClickable="true"
                android:unselectedAlpha="0.6" />
            <TextView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/titelzeile" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:gravity="center_horizontal"
                android:text="Titelzeile" android:textStyle="bold">
            </TextView>
            <TableLayout android:id="@+id/tableLayout1"
                android:layout_width="fill_parent" android:layout_height="wrap_content">
                <TextView android:text="TextView" android:id="@+id/textView1"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
                <TableRow android:layout_width="wrap_content" android:id="@+id/tableRow1"
                    android:layout_height="wrap_content">
                    <TextView android:id="@+id/textView2" android:layout_width="wrap_content"
                        android:text="@string/hello" android:layout_height="wrap_content"></TextView>
                    <EditText android:text="EditText" android:id="@+id/editText1"
                        android:layout_width="wrap_content" android:layout_height="wrap_content"></EditText>
                </TableRow>
                <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                    <TextView android:text="TextView" android:id="@+id/textView3"
                        android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
                    <EditText android:text="EditText" android:id="@+id/editText2"
                        android:layout_width="wrap_content" android:layout_height="wrap_content"></EditText>
                </TableRow>
    
            </TableLayout>
            <ListView android:id="@+id/listView1" android:layout_width="fill_parent"
                android:layout_height="fill_parent" android:layout_weight="1.0">
            </ListView>
            <TextView android:id="@android:id/empty"
                android:layout_width="wrap_content" android:layout_height="wrap_content"
                android:text="Liste ist leer" />
    
            <ScrollView android:id="@+id/scrollView1"
                android:layout_height="wrap_content" android:layout_width="1000px">
                <LinearLayout android:layout_width="wrap_content"
                    android:id="@+id/linearLayout3" android:layout_height="fill_parent">
                    <ImageButton android:layout_width="wrap_content"
                        android:src="@drawable/icon" android:layout_height="wrap_content"
                        android:paddingLeft="15px" android:id="@+id/buSwitch"></ImageButton>
                    <ToggleButton android:id="@+id/toggleButton1"
                        android:layout_width="wrap_content" android:text="ToggleButton"
                        android:layout_height="wrap_content"></ToggleButton>
                </LinearLayout>
            </ScrollView>
    
        </LinearLayout>
    </ScrollView>
    
    und die Klasse (mit der tollen Demo für die Fastscroll-Anzeige :):
    Code:
    package com.acut_edv.test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Random;
    import java.util.Set;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.ImageButton;
    import android.widget.ListView;
    import android.widget.SectionIndexer;
    import android.widget.TableLayout;
    import android.widget.ToggleButton;
    
    public class LayoutTester extends Activity {
        // FastScroll-Demo von http://www.anddev.org/tutalphabetic_fastscroll_listview_-_similar_to_contacts-t10123.html 
        ToggleButton schalter = null;
        TableLayout table = null;
        ListView myListView = null;
    
        ArrayList<String> elements;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ImageButton bu = (ImageButton) findViewById(R.id.buSwitch);
            schalter = (ToggleButton) findViewById(R.id.toggleButton1);
            table = (TableLayout) findViewById(R.id.tableLayout1);
            myListView = (ListView) findViewById(R.id.listView1);
            bu.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View view) {
                    setViews();
                }});
    
    
            // elements
            String s = "QWERTZUIOPASDFGHJKLYXCVBNM";
            Random r = new Random();
            elements = new ArrayList<String>();
            for (int i = 0; i < 300; i++) {
    
                elements.add(s.substring(r.nextInt(s.length())));
    
            }
            Collections.sort(elements); // Must be sorted!
    
            // listview
            myListView.setFastScrollEnabled(true);
            MyIndexerAdapter<String> adapter = new MyIndexerAdapter<String>(
                    getApplicationContext(), android.R.layout.simple_list_item_1,
                    elements);
            myListView.setAdapter(adapter);
    
    
        }
        
        public void setViews(){
            schalter.setChecked(!schalter.isChecked());
            if (schalter.isChecked()) {
                table.setVisibility(View.VISIBLE);
                myListView.setVisibility(View.INVISIBLE);
            } else {
                table.setVisibility(View.INVISIBLE);
                myListView.setVisibility(View.VISIBLE);
            }
            table.invalidate();
            myListView.invalidate();
        }
        
        class MyIndexerAdapter<T> extends ArrayAdapter<T> implements SectionIndexer {
    
            ArrayList<String> myElements;
            HashMap<String, Integer> alphaIndexer;
    
            String[] sections;
    
            public MyIndexerAdapter(Context context, int textViewResourceId,
                    List<T> objects) {
                super(context, textViewResourceId, objects);
                myElements = (ArrayList<String>) objects;
                // here is the tricky stuff
                alphaIndexer = new HashMap<String, Integer>();
                // in this hashmap we will store here the positions for
                // the sections
    
                int size = elements.size();
                for (int i = size - 1; i >= 0; i--) {
                    String element = elements.get(i);
                    alphaIndexer.put(element.substring(0, 1), i);
                    //We store the first letter of the word, and its index.
                    //The Hashmap will replace the value for identical keys are putted in
                }
    
                // now we have an hashmap containing for each first-letter
                // sections(key), the index(value) in where this sections begins
    
                // we have now to build the sections(letters to be displayed)
                // array .it must contains the keys, and must (I do so...) be
                // ordered alphabetically
    
                Set<String> keys = alphaIndexer.keySet(); // set of letters ...sets
                // cannot be sorted...
    
                Iterator<String> it = keys.iterator();
                ArrayList<String> keyList = new ArrayList<String>(); // list can be
                // sorted
    
                while (it.hasNext()) {
                    String key = it.next();
                    keyList.add(key);
                }
    
                Collections.sort(keyList);
    
                sections = new String[keyList.size()]; // simple conversion to an
                // array of object
                keyList.toArray(sections);
    
                // ooOO00K !
    
            }
    
            @Override
            public int getPositionForSection(int section) {
                // Log.v("getPositionForSection", ""+section);
                String letter = sections[section];
    
                return alphaIndexer.get(letter);
            }
    
            @Override
            public int getSectionForPosition(int position) {
    
                // you will notice it will be never called (right?)
                Log.v("getSectionForPosition", "called");
                return 0;
            }
    
            @Override
            public Object[] getSections() {
    
                return sections; // to string will be called each object, to display
                // the letter
            }
    
        }
    }
     
  4. swordi, 22.09.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du kannst keine listview in eine scrollview packen.

    zumindest können schon, nur wirst du damit nicht glücklich werden.
     
  5. Gibbsnich, 22.09.2011 #5
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Dann vergiss die ScrollView, die kann ich ja auch nur um die Tabelle legen.

    Das eigentliche Problem ist, dass die ListView klein bleibt, auch wenn das TableLayout unsichtbar wird.
    Wie bekomme ich es hin, dass die ListeView den freigewordenen Bereich ausfüllt?
     
  6. v Ralle v, 22.09.2011 #6
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Um ehrlich zu sein blicke ich bei deinem Vorhaben nicht mehr durch ^^ Vielleicht helfen Screenshots von dem, was du bisher hast.

    Setzt du die Visibility auf Invisible oder Gone? Denn bei Invisible bleibt der Platz für eine View reserviert, bei Gone wird der Platz durch andere Views gefüllt.
     
    Gibbsnich bedankt sich.
  7. Gibbsnich, 22.09.2011 #7
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Meinst du, ich blicke das...? :bored:

    Im Ernst: Oben soll eine Gallery und eine Titelzeile stehen, dann kommen in dem TableLayout je nach gesendeten Daten Dialoge oder Listen und das sieht ungefähr so aus:

    [​IMG]

    (Nicht erschrecken wgen dem Layout: Ist nur testweise ;-)

    Alternativ kommt aber auch die ListView zum Einsatz für eine einspaltige Liste mit alphabetischem Index und das sieht ungefähr so aus:

    [​IMG]

    Ich möchte also entweder TableLayout *oder* die ListView.
    In jedem Fall aber oben die Gallery und die Titelzeile und unten die Buttons.

    Ich hoffe, das ist verständlich ausgedrückt :unsure:?
    Super: GONE klappt!!

    Was jetzt noch hakt, sind lange Dialoge. Wenn ich das TableLayout in eine ScrollView bette, überlagert der Dialog mir die Buttons unten.

    Wie kann ich der ScrollView klarmachen, dass unten noch etwas steht?
     
  8. v Ralle v, 22.09.2011 #8
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Hm das klingt etwas komisch. Schachtel die ScrollView nochmal in ein LinearLayout, das könnte klappen.

    Ungefähr so:

    Gallery
    LinearLayout
    -->ScrollView
    -->-->TableLayout
    Button unten
     
  9. Gibbsnich, 22.09.2011 #9
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Jetzt geht es, ist aber komplexer:

    LinearLayout
    -->Gallery
    -->TextView Titel

    -->LinearLayout für TableLayout
    -->-->ScrollView für TableLayout
    -->-->-->TableLayout
    -->-->-->-->TableRow
    -->-->-->-->-->TextView
    -->-->-->-->-->TextView
    -->-->-->-->-->...
    -->-->-->-->/TableRow
    -->-->-->/TableLayout
    -->-->/ScrollView
    -->/LinearLayout

    -->ListView für indizierte Liste
    -->/ListView

    -->ScrollView für Buttons unten
    -->-->LinearLayout für Buttons
    -->-->-->ImageButton
    -->-->-->...
    -->-->/LinearLayout
    -->/ScrollView
    /LinearLayout>

    Puuhhhh....

    DANKE v Ralle v !!! :thumbsup:
     
  10. v Ralle v, 22.09.2011 #10
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Ja sieht ziemlich überladen aus ^^ Denk auch dran, dass die Performance darunter leidet. Dazu gibt es auch irgendwo einen Artikel (glaube das stand in dem zum Hierarchy Viewer), dass man nur eine maximale Grenze an Views nutzen soll. Die sollte zwar noch nicht erreicht sein, aber nur als Info ;-)

    Freut mich aber, dass es funktioniert :)
     

Diese Seite empfehlen