2013-04-17 9 views
6

Ich möchte eine App mit einer Login-Aktivität/Layout ähnlich wie die Facebook-App hat. Was ich meine ist, wenn das Textfeld fokussiert ist, drückt die Soft-Tastatur die gesamte Ansicht nach oben, ohne jedoch ein Logo zu quetschen. Ich habe versucht android:windowSoftInputMode="adjustPan/adjustResize", aber es ist nicht das, was ich versuchte zu erreichen.Erstellen von Login-Layout wie in Facebook-App für Android

Ich fand this Frage zu SO vielleicht wird es die Dinge klarer, aber es hat keine Lösung für das Problem.

Ich habe auch verschiedene Layout-Typen ausprobiert, aber es Soft-Tastatur schiebt nur den fokussierten < EditText> nach oben. Bitte führen Sie mich.

UPDATE:

enter image description hereenter image description here

enter image description hereenter image description here

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#DDDDDD"> 
    <RelativeLayout 
     android:height="0dp" 
     android:layout_weight="1" 
     android:layout_height="0dp" 
     android:layout_width="fill_parent" 
     android:background="#ff0000"> 
     <ImageView 
      android:layout_centerVertical="true" 
      android:layout_height="fill_parent" 
      android:layout_width="fill_parent"></ImageView> 
    </RelativeLayout> 
    <RelativeLayout 
     android:height="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:layout_width="fill_parent" 
     android:background="#00ff00"> 
    </RelativeLayout> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="#0000ff" 
     android:height="0dp" > 

     <Button 
      android:layout_width="fill_parent" 
      android:layout_height="40dp" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" 
      android:text="Log in" 
      /> 

     <EditText 
      android:layout_width="fill_parent" 
      android:layout_height="40dp" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:padding="4dp" 
      android:hint="password" 
      android:inputType="textPassword" > 
     </EditText> 

     <EditText 
      android:id="@+id/editText1" 
      android:hint="login" 
      android:padding="4dp" 
      android:layout_width="fill_parent" 
      android:layout_height="40dp" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" ></EditText> 
    </RelativeLayout> 

</LinearLayout> 

UPDATE Arbeitslösung ich hier nicht die gesamte XML-Datei einfügen kann, aber die Struktur sollte genug sein . Basiert auf Gabe Sechans Antwort.

Layout{ 
    Layout top weight 1 
    Layout mid weight 1 
    Layout bot weight 1 
} 

Kinder Layouts haben auf:

android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="1" // should be changed accordingly to your layout design. 

Und hier ist ein Java-Code für die Aktivität (Tastatur oben/unten):

View top, mid, bot; 
    final View activityRootView = findViewById(R.id.loginLayout); 
      activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
        new OnGlobalLayoutListener() { 
         @Override 
         public void onGlobalLayout() { 
          int heightDiff = activityRootView.getRootView() 
            .getHeight() - activityRootView.getHeight(); 
          if (heightDiff > 100) { //keyboard up 
           mid.setVisibility(View.INVISIBLE); 
           top.setLayoutParams(new TableLayout.LayoutParams(
             LayoutParams.MATCH_PARENT, 0, 0f)); 
           bot.setLayoutParams(new TableLayout.LayoutParams(
             LayoutParams.MATCH_PARENT, 0, 1f)); 

          } else {// keyboard down 
           // v.setVisibility(View.VISIBLE); 
           mid.setVisibility(View.VISIBLE); 
           top.setLayoutParams(new TableLayout.LayoutParams(
             LayoutParams.MATCH_PARENT, 0, 2f)); 
           bot.setLayoutParams(new TableLayout.LayoutParams(
             LayoutParams.MATCH_PARENT, 0, 3f)); 

          } 
         } 
        }); 

Auf Tastatur Sie oben ändern müssen Gewichte, die dem Tastatur-Up-Design und der Tastatur entsprechen, werden auf den Standard zurückgesetzt (Layout, das Sie über xml/java eingestellt haben). Ich habe den Code auf 2.3.x und höher getestet. Und vergessen Sie nicht, android:inputType="textFilter" für den Login & Passwort EditText 's zu verwenden, um Vorschläge zur Eingabe zu entfernen und einige Pixel zu speichern. In Ihrem Manifest für die Aktivität android:windowSoftInputMode="adjustResize|stateHidden". stateHidden wird verwendet, damit die Tastatur beim Laden der Aktivität nicht aktiv ist. Ich hoffe es hilft. Viel Glück.

Antwort

8

Sie tun es mit relativen Layouts, adjustResize und android: layout_centerVertical. Grundsätzlich haben sie ein lineares Layout für ihr Hauptlayout, mit 3 gleich gewichteten relativen Layouts darin. Jeder ist auf 0dp Höhe eingestellt, so dass sie gleiche Drittel des Bildschirms einnehmen. Das obere RelativeLayout enthält das vertikal zentrierte Logo. In der Mitte befinden sich die Anmeldefelder und der Button, die vertikal übereinander liegen. Die untere enthält den Copyright-Text, der nach unten ausgerichtet ist. Das Endergebnis ist, dass wenn die Tastatur hochkommt, die 3 relativen Layouts angepasst werden, um 1/3 des neuen Bildschirms zu nehmen. Dann werden ihre Elemente auf dem neuen Bildschirm zentriert.

Erinnern Sie sich daran, dass Sie den Fenstermodus adjustResize benötigen, um dies zu erhalten, wenn Sie pan verwenden, wird es nur nach oben bewegt und das Logo wird aus der Mitte scrollen.

+0

Können Sie bitte mein Update sehen. Im Facebook-App-Teil, der Login-Felder enthält, wird die Größe nicht geändert, aber die Größe der oberen und unteren Elemente wird geändert. In meiner App werden Felder zusammengeführt.Hilf mir bitte. Ich habe das XML basierend auf deiner Antwort geschrieben. Neu bei Android. –

+1

In der Facebook-Layout, da der Boden fast vollständig leer ist, können Sie es viel weniger Gewicht als die Login-Bereich, so dass es größer auf Kosten der anderen. Sie können mit den Gewichten der 3 Abschnitte spielen, um zu bekommen, wo Sie wollen. Ich würde wahrscheinlich auch die Höhen der EditTexte und Buttons wrap_content machen, um ein paar Pixel zu sparen. –

+0

Danke, spielen mit Gewicht gelöst ist das, was ich brauchte. Wissen Sie, wie Sie das Gewicht einer Ansicht/eines Layouts programmgesteuert ändern können? –

0

Wechseln Sie in Eclipse zu Datei | Neu | Andere und wählen Sie im folgenden Assistenten Android-Aktivität und dann auf der nächsten Seite LoginActivity aus der Liste der Aktivitäten aus. Dies hat genau das Layout, von dem Sie sprechen, und Sie können das als Rahmen verwenden. Es verwendet eine ScrollView, um den gewünschten Effekt zu erzielen.

+1

Nicht sicher über Eclipse, aber es ist falsch für Android Studio. – AlexKorovyansky

Verwandte Themen