2016-09-11 12 views
6

Stworzyłem siatkę zawierającą pełne teksty. Chcę, aby tekst automatycznie dopasowywał się do rozmiaru ekranu. Próbowałem poniższy kod,Automatyczne dopasowanie do rozmiaru ekranu w układzie siatki Android

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
    float dpWidth = displayMetrics.widthPixels/displayMetrics.density; 
    int noOfColumns = (int) (dpWidth/50); 
    return noOfColumns; 

Chcę wyjściowy coś takiego

image] 2

imag2 to nie działa jak na moje potrzeby. Proszę pomóż . Z góry dziękuję.

+0

Na czym polega problem z tym kodem? – Vyacheslav

+0

Chcę automatycznie dopasować, ale nie działa automatycznie. @Vyacheslav – Anusha

+0

Masz na myśli, że nie możesz obliczyć wysokości czcionki. Czy mam rację? – Vyacheslav

Odpowiedz

0

Dla GridLayout

<?xml version="1.0" encoding="utf-8"?> 
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:columnCount="4" 
    android:orientation="horizontal" > 
    <Button android:text="1" /> 
    <Button android:text="2" /> 
    <Button android:text="3" /> 
    <Button android:text="4" /> 
    <Button android:text="5" /> 
    <Button android:text="6" /> 
    <Button android:text="7" /> 
    <Button android:text="8" /> 
    <Button android:text="9" /> 
    <Button android:text="10" /> 
    <Button android:text="11" /> 
    <Button android:text="12" /> 
    <Button android:text="13" /> 
    <Button android:text="14" /> 
    <Button android:text="15" /> 
    <Button android:text="16" /> 
</GridLayout> 

programowo:

GridLayout gridLayout = new GridLayout(this); 
gridLayout .setColumnCount(4); 
///... 

przykład: https://stackoverflow.com/a/14715333/1979882

dostosować GridView użyć tej metody:

private void adjustGridView() { 
    gv.setNumColumns(GridView.AUTO_FIT); 
    gv.setColumnWidth(70); 
} 
+0

Czy możemy wdrożyć to samo w układzie Grid? Ponieważ nie znajduję funkcji auto_fit w układzie siatki @Vyacheslav – Anusha

+0

@Ausha, zaktualizowany dla gridlayout xml – Vyacheslav

+1

Chcę, żeby kolumna była auto_fit a nie twardym kodem @Vyacheslav – Anusha

0

Wykonaj th e następujące;

  • Użyj swojego kodu, aby obliczyć liczbę kolumn w onCreate lub onCreateView. Należy pamiętać o odstępach między kolumnami.

  • połączeń setColumnCount na GridLayout z powyższej liczby

  • W swojej xml, dodać atrybut android:layout_columnWeight="1" do wszystkich elementów w GridLayout. Spowoduje to rozciągnięcie kolumn w interfejsie API 21 i nowszych.

  • W pre API 21 można wyśrodkować widok GridView w poziomie, aby wyglądał przyzwoicie. Albo jeszcze lepiej, obliczyć preferowaną kolumnęWidth (gridWidth/columnCount) i iterować przez wszystkie elementy w siatce (ViewGroup) i ustawić ich szerokość na columnWidth.

0

Trudno byłoby zrobić GridLayout zrobić to, czego potrzebujesz:

  • Chociaż można przeczytać szerokość ekranu z pomocą DisplayMetrics, że metoda byłaby niezgodna z nowymi wersjami Androida, które obsługują podzielony ekran. Potrzebujesz szerokości widoku rodzica, a nie całego ekranu.

  • Nawet przy założeniu, że wskaźniki wyświetlania dają niezawodną szerokość okna wyświetlającego Twoją aktywność, ta logika zostanie przerwana, gdy tylko umieścisz układ w fragmencie obok innego fragmentu. Nie ma sensu tworzyć czegoś tak nieelastycznego.

  • Szerokość widoku rodzica nie jest znana, dopóki układ nie zostanie ukończony. To nie uniemożliwia użycia, tylko podstępne.

Prostym rozwiązaniem jest użycie zamiast GridView który jest lepiej zaprojektowany do tego celu, ponieważ ma możliwość autofit dla liczby kolumn.

+0

Wygląda na to, że 'getMetrics' zwraca wirtualny rozmiar podzielonego okna, więc będzie dobrze działać. Możesz użyć 'getRealMetrics', aby uzyskać rozmiar pełnego ekranu. – lionscribe

+0

Dziękuję za to i wezmę na to twoje słowo. Nadal martwię się o RemixOS, różne programy Samsunga i inne firmy sprzętowe używają w skórach, i ogólnie rzecz biorąc, co może się zdarzyć na jakimś urządzeniu, z którym nie testowałem. –

+0

Właściwie nigdy sam tego nie testowałem, cytowałem tylko z tego, co przeczytałem na http://stackoverflow.com/questions/36706365/how-to-get-screen-screen-size-after-android-n – lionscribe

3

Oto realizacja zwyczaj GridLayout że zrobi to, czego potrzebujesz: AutoGridLayout

public class AutoGridLayout extends GridLayout { 

    private int defaultColumnCount; 
    private int columnWidth; 

    public AutoGridLayout(Context context) { 
     super(context); 
     init(null, 0); 
    } 

    public AutoGridLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(attrs, 0); 
    } 

    public AutoGridLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(attrs, defStyleAttr); 
    } 

    private void init(AttributeSet attrs, int defStyleAttr) { 
     TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AutoGridLayout, 0, defStyleAttr); 
     try { 
      columnWidth = a.getDimensionPixelSize(R.styleable.AutoGridLayout_columnWidth, 0); 

      int[] set = { android.R.attr.columnCount /* id 0 */ }; 
      a = getContext().obtainStyledAttributes(attrs, set, 0, defStyleAttr); 
      defaultColumnCount = a.getInt(0, 10); 
     } finally { 
      a.recycle(); 
     } 

     /* Initially set columnCount to 1, will be changed automatically later. */ 
     setColumnCount(1); 
    } 

    @Override 
    protected void onMeasure(int widthSpec, int heightSpec) { 
     super.onMeasure(widthSpec, heightSpec); 

     int width = MeasureSpec.getSize(widthSpec); 
     if (columnWidth > 0 && width > 0) { 
      int totalSpace = width - getPaddingRight() - getPaddingLeft(); 
      int columnCount = Math.max(1, totalSpace/columnWidth); 
      setColumnCount(columnCount); 
     } else { 
      setColumnCount(defaultColumnCount); 
     } 
    } 
} 

Wystarczy dodać do pliku XML szablonu tak:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.km.myproject.customview.AutoGridLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:columnCount="5" 
     app:columnWidth="50dp"/> 

</FrameLayout> 

Korzystanie columnWidth postara się obliczyć, ile kolumny mogą się dopasować i automatycznie ustawić optymalną liczbę przęseł. Jeśli nie zostanie użyty (lub z jakiegoś powodu nie zmierzył), zostanie użyty atrybut columnCount.

Mam nadzieję, że to pomoże!

Powiązane problemy