11
votes

Scrollable linearlayout avec des poids plus gros que l'écran dans Android

J'essaie de créer une linearlayout vertical avec des poids qui a une taille plus grande que l'écran. Disons 2x la taille de l'écran. Pour que cela fonctionne, je devrais évidemment être capable de faire défiler. Malheureusement, je ne peux pas comprendre un moyen de faire cela. J'ai essayé d'utiliser les poids de la disposition et de régler la somme de poids en tant que moitié de la somme réelle des poids de tous les composants (donc si tous les composants poids sont 20, je définit la somme de poids comme 10) et géré pour le faire fonctionner mais malheureusement le Le défilement ne fonctionne plus pour une raison quelconque.

Y a-t-il quelque chose qui me manque?

Ceci est le code qui rend le linéarlayout deux fois plus grand que l'écran, mais le défilement ne fonctionne pas: xxx


0 commentaires

3 Réponses :


1
votes

Le problème Voici votre utilisation de layout_weight code> et poids code> n'est pas valide. Il est important de se rappeler que android: layout_weight code> ne peut utiliser que l'espace restant disponible fort> dans la vue; tout ce qui dépasse cette limite est automatiquement recadré.

Par conséquent, dans votre exemple, votre premier eittext code> prend entièrement l'intégralité de l'écran et votre seconde est entièrement exclu de la vue. Parce que le second eittext code> est recadré, le linearlayout code> a pris l'écran en entier et il n'y a rien pour le ScrollView code> à faire. P>

Je ne suis pas totalement sûr de ce que votre objectif final est; Essayez-vous d'avoir des entrées de texte qui poussent avec l'entrée utilisateur, et le ScrollView code> gère le trop-plein? p>

Si tel est le cas, cela fonctionnera: P>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="#000000"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:orientation="vertical" >

        <EditText
        android:id="@+id/id1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#DCDCDC"
        android:gravity="center"
        android:text="ONE ONE ONE"
        android:textIsSelectable="false"
        android:textSize="45sp" />

    <EditText
        android:id="@+id/id2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#AAAAAA"
        android:gravity="center"
        android:text="TWO TWO TWO"
        android:textIsSelectable="false"
        android:textSize="45sp" />
    </LinearLayout>

</ScrollView>


6 commentaires

Bonjour. Merci pour la réponse. Fondamentalement, en une phrase, un bon exemple de ce que j'essaie d'atteindre est 3 TextViews, chacun avec la taille 1/2 de la taille de l'écran. Cela signifie que les 2 apparaîtront à l'écran et que le troisième apparaîtrait que lors du défilement.


Il n'y a aucun moyen de le faire dans Pure XML; Vous devez mesurer l'écran et définir la hauteur de la vue dans le code. Je peux fournir un échantillon pour vous.


@sakiskaliakoudas pour que vous souhaitiez définir ensemble layout_height comme 0 dP et leyout_weight comme 0.5


@shijub qui ne fonctionne pas, s'il vous plaît voir ma réponse ci-dessus; Faire ce que vous avez dit des résultats dans la mise en page remplissant la fenêtre sans défilement. Ajouter sur un 3ème eittext et il sera inaccessible hors écran.


@sakiskaliakoudas ne définit pas layout_weight comme 2.make It tandis que 0,5 pour les deux textes d'édition.


@shijub juste pour réitérer, cela ne fonctionne pas. Tout ce qui sera effectué est de remplir la fenêtre de 50% par EditText et ne lui permettez pas de faire défiler.



7
votes

Basé sur votre commentaire, voici une manière programmatique d'atteindre ce que vous recherchez. Je ne crois pas qu'il existe un moyen d'accomplir cela dans la mise en page pure xml.

mise en page: p> xxx pré>

Activité: p>

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // Get display size -- API L13 and up. Otherwise use getResources().getDisplayMetrics();
      Display display = getWindowManager().getDefaultDisplay();
      Point size = new Point();
      display.getSize(size);


      // You want size to be 50% per EditText, so divide available height by 2.
      // Note: this is absolute height, does not take into consideration window decoration!
      int editTextHeight = size.y / 2;

      // Get a handle to your EditTexts
      EditText t1 = (EditText) findViewById(R.id.id1);
      EditText t2 = (EditText) findViewById(R.id.id2);
      EditText t3 = (EditText) findViewById(R.id.id3);

      // Set height to 50% of screen size each
      t1.setHeight(editTextHeight);
      t2.setHeight(editTextHeight);
      t3.setHeight(editTextHeight);
}


1 commentaires

Merci pour la réponse. Je savais comment faire cela de manière programmative, mais vaut toujours la prime même pour confirmer que cela ne peut pas être fait dans Pure XML



3
votes

Vous avez déclaré la hauteur de votre linearlayout " match_parent " qui est égal à la hauteur de ses parents. Il ne fera jamais défiler tant que le contenu est plus grand puis ScrollView . Tout d'abord, vous devez donner une hauteur fixe comme (50dP) ou wrap_content ou vous devez définir sa hauteur programmatique (comme 2x hauteur de l'écran comme mentionnant).

poids et poids forcera toujours vos éléments à installer dans votre linearlayouts Taille actuelle afin d'essayer de ne pas l'utiliser.

J'espère que cela vous aidera.


0 commentaires