Layoutproblem

Gibbsnich

Gibbsnich

Ambitioniertes Mitglied
0
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:
androidlayout.jpg


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?
 
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

  • Layout.png
    Layout.png
    17,2 KB · Aufrufe: 291
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
        }

    }
}
 
du kannst keine listview in eine scrollview packen.

zumindest können schon, nur wirst du damit nicht glücklich werden.
 
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?
 
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.
 
  • Danke
Reaktionen: Gibbsnich
v Ralle v schrieb:
Um ehrlich zu sein blicke ich bei deinem Vorhaben nicht mehr durch ^^ Vielleicht helfen Screenshots von dem, was du bisher hast.
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:

dialog2.png


(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:

liste.png


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:?
v Ralle v schrieb:
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.

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?
 
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
 
v Ralle v schrieb:
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

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:
 
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 :)
 

Ähnliche Themen

P
Antworten
3
Aufrufe
962
markus.tullius
markus.tullius
T
Antworten
3
Aufrufe
942
blackfire185
blackfire185
Gibbsnich
Antworten
2
Aufrufe
684
Gibbsnich
Gibbsnich
Zurück
Oben Unten