2013-04-17 10 views
6

Chcę utworzyć aplikację z aktywnością logowania/układem podobną do tej, którą ma aplikacja Facebook. Mam na myśli to, że gdy pole tekstowe jest skupione, miękka klawiatura przesuwa cały widok, ale nie zgniata logo. Próbowałem android:windowSoftInputMode="adjustPan/adjustResize", ale to nie jest to, co próbowałem osiągnąć.Tworzenie układu logowania jak w aplikacji Facebook dla Androida

Znalazłem this pytanie na SO być może to uczyni rzeczy jaśniejsze, ale nie ma rozwiązania problemu.

Próbowałem także różnych typów układów, ale miękka klawiatura tylko naciska skoncentrowany < EditText> w górę. Proszę, prowadź mnie.

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 roztwór roboczy nie mogę wkleić tutaj cały plik xml, ale struktura ta powinna być na tyle . Na podstawie odpowiedzi Gabe Sechan.

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

układy dziecko ma wartość:

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

A oto kod Java dla aktywności (klawiatura w górę/w dół):

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

          } 
         } 
        }); 

Na klawiaturze aż trzeba zmienić wagi wchodzące w skład konstrukcji klawiatury i na klawiaturze zmieniają się z powrotem na domyślne (układ ustawiony za pomocą xml/java). Testowałem kod w wersji 2.3.x i nowszej. I nie zapomnij użyć android:inputType="textFilter" dla logowania & hasło, aby usunąć sugestie dotyczące wprowadzania i zapisać kilka pikseli. W swoim manifeście dla działania android:windowSoftInputMode="adjustResize|stateHidden". stateHidden jest używany tak, aby klawiatura nie była podniesiona po załadowaniu aktywności. Mam nadzieję, że to pomoże. Powodzenia.

Odpowiedz

8

Robią to ze względnymi układami, adjustResize i androidem: layout_centerVertical. Zasadniczo mają układ liniowy dla głównego układu, z 3 równorzędnymi układami względnymi w środku. Każda z nich ma wysokość 0 dp, więc zajmuje ona równe trzecie ekranu. Górny RelativeLayout trzyma logo, wyśrodkowane w pionie. W środku znajdują się pola logowania i przycisk, wyśrodkowany pionowo jeden na drugim. W dolnej znajduje się tekst praw autorskich, wyrównany do dołu. Wynik końcowy jest taki, że po pojawieniu się klawiatury, 3 względne układy zmieniają rozmiar, aby uzyskać 1/3 nowego ekranu. Następnie ich elementy są wyśrodkowane na nowym ekranie.

Pamiętaj, że potrzebujesz trybu okna adjustResize, aby to uzyskać, jeśli użyjesz panki, po prostu przesuniesz się w górę, a logo przewinie się poza centrum.

+0

Czy możesz zobaczyć moją aktualizację. W części aplikacji na Facebooku, która zawiera pola logowania, nie jest zmieniana wielkość, ale zmienia się górny i dolny element. W moich polach aplikacji scalam.Pomóż mi proszę. Napisałem xml na podstawie twojej odpowiedzi. Nowy na Androida. –

+1

W układzie na facebooku, ponieważ dno jest prawie całkowicie puste, można nadać mu znacznie mniejszą wagę niż sekcja pola logowania, pozwalając mu zwiększyć kosztem innych. Możesz grać z wagami z 3 sekcji, aby dostać się tam, gdzie chcesz. Prawdopodobnie osiągnę też wysokość EditTexts i przycisków wrap_content, aby zaoszczędzić kilka pikseli. –

+0

Dzięki, gra z ciężarem rozwiązanym jest tym, czego potrzebowałem. Czy wiesz, jak programowo zmienić wagę widoku/układu? –

0

W Eclipse przejdź do Plik | Nowy | Inne iw Czarodziejku, który następuje, wybierz Aktywność Androida, a następnie na następnej stronie wybierz z listy działań Aktywność logowania. Ma to dokładnie taki układ, o którym mówisz, i możesz go użyć jako ramy. Używa ScrollView, aby osiągnąć efekt, którego szukasz.

+1

Nie jestem pewien o Eclipse, ale jest on nieprawidłowy dla Androida Studio. – AlexKorovyansky

Powiązane problemy