Android: Tab tại BOTTOM


148

Tôi đã thấy một số trò chuyện về điều này, nhưng không có gì rõ ràng. Có cách nào để đặt các tab trong TabWidget xuống cuối màn hình không? Nếu vậy thì thế nào?

Tôi đã thử những cách sau, nhưng không hiệu quả:

a) thiết lập bảng điều khiển bên dưới framelayout
b) đặt lực hấp dẫn của tab Tabget về "đáy"

Cảm ơn! sẽ


10
Vui lòng xác định "không hoạt động".
CommonsWare

Tôi sử dụng một từ trang web dưới đây. nó đang hoạt động http://kpbird.blogspot.com/2011/05/androidbottom-tabbar-control.html
Juliousraj

3
Nhìn vào đây nếu bạn muốn iPhone như máy chủ tab.
Adil Soomro

Câu trả lời:


272

Đây là giải pháp đơn giản nhất, mạnh mẽ nhất và có thể mở rộng để nhận các tab ở phía dưới màn hình.

  1. Trong linearLayout dọc của bạn, đặt FrameLayout phía trên TabWidget
  2. Đặt layout_heightthành wrap_contenttrên cả FrameLayout và TabWidget
  3. Đặt FrameLayout android:layout_weight="1"
  4. Đặt TabWidget's android:layout_weight="0"(0 là mặc định, nhưng để nhấn mạnh, dễ đọc, v.v.)
  5. Đặt TabWidget's android:layout_marginBottom="-4dp"(để xóa dải phân cách dưới cùng)

Mã đầy đủ:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_weight="1"/>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:layout_marginBottom="-4dp"/>

    </LinearLayout>

</TabHost>

3
Bộ chia thực sự được mã hóa cứng. Tôi đã cố gắng thay đổi các ngăn kéo được sử dụng cho các tab và tìm thấy nó. Tổng số bummer.
Jeremy Logan

6
Bạn nên chọn cái này (hoặc cái gì đó) làm câu trả lời được chấp nhận.
JediPotPie

4
Độ lệch yêu cầu duy nhất ở đây so với ví dụ TabWidget tiêu chuẩn của Google là cài đặt layout_weight=1trên FrameLayout. Điều này cho phép điều khiển tab "yêu cầu" chiều cao của nó ra khỏi linearLayout trước tiên.
Nick Farina

19
Để thoát khỏi dải phân cách ở dưới cùng của TabWidget, chỉ cần thêm android:layout_marginBottom="-5px"vào TabWidget. Điều này sẽ di chuyển TabWidget ra khỏi đáy màn hình 5 pixel, vừa đủ để bạn không nhìn thấy dải phân cách. FrameLayout sẽ bù kích thước để nó hoạt động hoàn hảo. Tôi không chắc kích thước của dải phân cách có thay đổi trên các thiết bị lớn hơn hay không. Bạn có thể phải sử dụng dpthay vì px.
Jake Wilson

1
Tôi đã kết hợp nhận xét loại bỏ phân chia vào câu trả lời.
Arne Evertsson

38

Hãy dùng thử;) Chỉ xem nội dung của FrameLayout (@ id / tabcontent), vì tôi không biết nó sẽ xử lý như thế nào trong trường hợp cuộn ... Trong trường hợp của tôi, nó hoạt động vì tôi đã sử dụng ListView làm nội dung của các tab . :) Hy vọng nó giúp.

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <RelativeLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
        <FrameLayout android:id="@android:id/tabcontent"
             android:layout_width="fill_parent" 
             android:layout_height="fill_parent"
             android:layout_alignParentTop="true" 
             android:layout_above="@android:id/tabs" />
    <TabWidget android:id="@android:id/tabs"
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true" />
    </RelativeLayout>
</TabHost>

4
+1 Nhưng bạn có để ý thanh màu đen / xám ở phía trên màn hình không? Làm thế nào bạn loại bỏ nó?
ahmet emrah

Tôi đang sử dụng điều này để đăng tiện ích tab lên phía bên trái của biểu mẫu.
mr.j05hua

12

Có một cách để loại bỏ các dòng.

1) Thực hiện theo hướng dẫn này: android-tab-with-Fragment

2) Sau đó áp dụng thay đổi RelativeLayout mà Leaudro đã đề xuất ở trên (áp dụng các đạo cụ bố cục cho tất cả các FrameLayouts).

Bạn cũng có thể thêm ImageView vào tab.xml trong mục số 1 và có giao diện giống iPhone cho các tab.

Đây là một ảnh chụp màn hình về những gì tôi đang làm việc ngay bây giờ. Tôi vẫn còn một số việc phải làm, chủ yếu là tạo bộ chọn cho các biểu tượng và đảm bảo phân phối ngang bằng nhau, nhưng bạn có ý tưởng. Trong trường hợp của tôi, tôi đang sử dụng các đoạn, nhưng cùng một hiệu trưởng nên áp dụng cho chế độ xem tab tiêu chuẩn.

nhập mô tả hình ảnh ở đây


Đã được một thời gian kể từ khi bạn đăng bài này, nhưng liên kết của bạn bây giờ có nội dung Chào mừng bạn đến với nginx! và không có gì khác ở đó trên trang.
DroidDev

1
Đó không phải là trang web của tôi, không may tôi không kiểm soát được nó. Sau khoảng thời gian này, các hệ thống đã thay đổi đủ để bạn có thể không nên triển khai loại giao diện này cho người dùng Android của mình, họ sẽ hy vọng mọi thứ sẽ hoạt động khác đi một chút.
Brill Pappin

3

Không chắc nó có hoạt động cho tất cả các phiên bản Android hay không (đặc biệt là các phiên bản có nội dung UI tùy chỉnh), nhưng tôi đã có thể xóa thanh màu xám ở phía dưới bằng cách thêm

 android:layout_marginBottom="-3dp"

tới XML của TabWidget ...


3

Đối với tất cả những người bạn cố gắng xóa dòng phân cách của tabWidget, đây là một dự án ví dụ (và hướng dẫn tương ứng của nó), hoạt động rất tốt để tùy chỉnh các tab và do đó loại bỏ các vấn đề khi các tab ở dưới cùng. Dự án Eclipse: android-custom-tab ; Giải thích ban đầu: blog ; Hy vọng điều này sẽ giúp.



3
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" />

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:background="#252a31"
            android:tabStripEnabled="false" >
        </TabWidget>
    </LinearLayout>

</TabHost>

1

Đây có thể không chính xác là những gì bạn đang tìm kiếm (nó không phải là một giải pháp "dễ dàng" để gửi Tab của bạn xuống cuối màn hình) nhưng vẫn là một giải pháp thay thế thú vị mà tôi muốn gắn cờ với bạn:

ScrollableTabhost được thiết kế để hoạt động giống như Tabhost, nhưng với một chế độ xem cuộn bổ sung để phù hợp với nhiều mặt hàng hơn ...

có thể đào sâu vào dự án nguồn mở này, bạn sẽ tìm thấy câu trả lời cho câu hỏi của mình. Nếu tôi thấy mọi thứ dễ dàng hơn tôi sẽ quay lại với bạn.


1

Tôi đã gặp vấn đề tương tự với các tab Android khi cố gắng đặt chúng ở dưới cùng của màn hình. Kịch bản của tôi là không sử dụng tệp bố cục và tạo các tab trong mã, tôi cũng đang tìm cách kích hoạt các hoạt động từ mỗi tab có vẻ hơi phức tạp khi sử dụng các phương pháp khác vì vậy, đây là mã mẫu để khắc phục vấn đề:

thêm-tab-trong-android-và-đặt-chúng


1

Có, xem: liên kết , nhưng anh ấy đã sử dụng bố cục xml, không phải hoạt động để tạo tab mới, vì vậy hãy đặt mã xml của anh ấy (đặt paddingTop cho FrameLayout - 0px) và sau đó viết mã:

public class SomeActivity extends ActivityGroup {

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

    TabHost tab_host = (TabHost) findViewById(R.id.edit_item_tab_host); 

    tab_host.setup(this.getLocalActivityManager());

    TabSpec ts1 = tab_host.newTabSpec("TAB_DATE"); 
    ts1.setIndicator("tab1"); 
    ts1.setContent(new Intent(this, Registration.class)); 
    tab_host.addTab(ts1); 

    TabSpec ts2 = tab_host.newTabSpec("TAB_GEO"); 
    ts2.setIndicator("tab2"); 
    ts2.setContent(new Intent(this, Login.class)); 
    tab_host.addTab(ts2); 

    TabSpec ts3 = tab_host.newTabSpec("TAB_TEXT"); 
    ts3.setIndicator("tab3"); 
    ts3.setContent(new Intent(this, Registration.class)); 
    tab_host.addTab(ts3); 

    tab_host.setCurrentTab(0);      


}

}


0

Tôi khuyên bạn nên sử dụng mã này cho công việc ổn định, nó được tối ưu hóa cho các đoạn được lồng trong tab (ví dụ: MapFragment lồng nhau) và đã thử nghiệm trên "không giữ hoạt động": https://stackoverflow.com/a/23150258/2765497

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.