Android: แท็บที่ด้านล่าง


148

ฉันเคยเห็นพูดคุยเกี่ยวกับเรื่องนี้ แต่ไม่มีอะไรแน่นอน มีวิธีวางแท็บใน TabWidget ที่ด้านล่างของหน้าจอหรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่ได้ผล:

a) การตั้งค่า tabwidget ด้านล่าง frayayout
b) การตั้งค่าแรงโน้มถ่วงของ tabwidget ให้เป็น "bottom"

ขอบคุณ! llappall


10
โปรดระบุ "ไม่ทำงาน"
CommonsWare

ฉันใช้จากเว็บไซต์ด้านล่าง มันใช้งานได้แล้วhttp://kpbird.blogspot.com/2011/05/androidbottom-tabbar-control.html
Juliousraj

3
ดูที่นี่หากคุณต้องการให้ iPhone เป็นโฮสต์ของแท็บ
Adil Soomro

คำตอบ:


272

นี่คือโซลูชันที่ง่ายที่สุดแข็งแกร่งที่สุดและปรับขนาดได้เพื่อรับแท็บที่ด้านล่างของหน้าจอ

  1. ใน LinearLayout แนวตั้งของคุณวาง FrameLayout เหนือ TabWidget
  2. ตั้งlayout_heightเป็นwrap_contentทั้งใน FrameLayout และ TabWidget
  3. ตั้งค่าของ FrameLayout android:layout_weight="1"
  4. Set TabWidget's android:layout_weight="0"(0 เป็นค่าเริ่มต้น แต่เน้นการอ่านง่าย ฯลฯ )
  5. ตั้งค่า TabWidget android:layout_marginBottom="-4dp"(เพื่อลบตัวหารด้านล่าง)

รหัสเต็ม:

<?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
ตัวแบ่งเป็นรหัสยากจริง ๆ ฉันพยายามเปลี่ยน drawable ที่ใช้สำหรับแท็บและพบว่า รวมคนเกียจคร้าน
Jeremy Logan

6
คุณควรเลือกคำตอบนี้ (หรือบางอย่าง) เป็นที่ยอมรับ
JediPotPie

4
ค่าเบี่ยงเบนที่จำเป็นเฉพาะที่นี่จากตัวอย่าง TabWidget มาตรฐานของ Google คือการตั้งค่าlayout_weight=1บน FrameLayout วิธีนี้ช่วยให้ตัวควบคุมแท็บ "อ้างสิทธิ์" ความสูงของ LinearLayout ก่อน
Nick Farina

19
เพื่อกำจัดตัวแบ่งที่ด้านล่างของ TabWidget เพียงเพิ่มandroid:layout_marginBottom="-5px"TabWidget สิ่งนี้จะย้าย TabWidget ที่ด้านล่างของหน้าจอ 5 พิกเซลเพียงพอที่คุณจะไม่เห็นตัวแบ่ง FrameLayout จะชดเชยขนาดเพื่อให้ทำงานได้อย่างสมบูรณ์ ฉันไม่แน่ใจว่าขนาดของตัวหารเปลี่ยนแปลงบนอุปกรณ์ขนาดใหญ่หรือไม่ คุณอาจจะต้องใช้แทนdp px
Jake Wilson

1
ฉันได้รวมความคิดเห็นเอาตัวแบ่งออกเป็นคำตอบ
Arne Evertsson

38

ลอง;) เพียงแค่ดูเนื้อหาของ FrameLayout (@ id / tabcontent) เพราะฉันไม่รู้ว่ามันจะจัดการอย่างไรในกรณีที่เลื่อน ... ในกรณีของฉันมันใช้งานได้เพราะฉันใช้ ListView เป็นเนื้อหาของแท็บของฉัน . :) หวังว่าจะช่วยได้

<?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 แต่คุณสังเกตเห็นแถบสีดำ / เทาที่ด้านบนของหน้าจอไหม คุณลบออกได้อย่างไร
ahmet emrah

ฉันใช้สิ่งนี้เพื่อโพสต์วิดเจ็ตแท็บลงบนด้านซ้ายของแบบฟอร์ม
mr.j05hua

12

มีวิธีลบบรรทัด

1) ทำตามบทช่วยสอนนี้: android-tabs-with-fragments

2) จากนั้นใช้การเปลี่ยนแปลง RelativeLayout ที่ Leaudro แนะนำข้างต้น (ใช้อุปกรณ์ประกอบฉากเลย์เอาต์กับ FrameLayouts ทั้งหมด)

นอกจากนี้คุณยังสามารถเพิ่ม ImageView ลงใน tab.xml ในรายการ # 1 และรับไอโฟนที่คล้ายกับแท็บ

นี่คือภาพหน้าจอของสิ่งที่ฉันกำลังทำอยู่ตอนนี้ ฉันยังคงมีงานต้องทำส่วนใหญ่เลือกสำหรับไอคอนและให้แน่ใจว่าการกระจายแนวนอนเท่ากัน แต่คุณได้รับความคิด ในกรณีของฉันฉันใช้แฟรกเมนต์ แต่หลักการเดียวกันควรนำไปใช้กับมุมมองแท็บมาตรฐาน

ป้อนคำอธิบายรูปภาพที่นี่


ไม่นานมานี้ที่คุณโพสต์ข้อความนี้ แต่ตอนนี้ลิงค์ของคุณบอกว่ายินดีต้อนรับสู่ nginx และไม่มีอะไรในหน้านี้อีกแล้ว
DroidDev

1
มันไม่ใช่เว็บไซต์ของฉันเพราะฉันไม่สามารถควบคุมมันได้อย่างน่าเสียดาย หลังจากผ่านช่วงเวลานี้ไปแล้วระบบก็เปลี่ยนไปมากพอที่คุณไม่น่าจะใช้อินเทอร์เฟซชนิดนี้สำหรับผู้ใช้ Android ของคุณพวกเขาคาดหวังว่าสิ่งต่าง ๆ จะทำงานแตกต่างกันเล็กน้อย
Brill Pappin

3

ไม่แน่ใจว่ามันจะใช้งานได้กับ Android ทุกรุ่น (โดยเฉพาะกับ UI ที่กำหนดเอง) แต่ฉันสามารถลบแถบสีเทาที่ด้านล่างโดยเพิ่ม

 android:layout_marginBottom="-3dp"

ไปที่ TabWidget XML ...


3

สำหรับบรรดาของคุณที่พยายามลบเส้นแยกของ tabWidget นี่เป็นตัวอย่างโครงการ (และบทช่วยสอนของมัน) ซึ่งทำงานได้ดีสำหรับการปรับแต่งแท็บและทำให้การลบปัญหาเมื่อแท็บอยู่ด้านล่าง Eclipse Project: android-custom-tabs ; คำอธิบายเดิม: บล็อก ; หวังว่านี่จะช่วยได้


3

มีสองวิธีในการแสดงแท็บที่ด้านล่างของกิจกรรมแท็บ

  1. ใช้รูปแบบที่สัมพันธ์กัน
  2. ใช้แอตทริบิวต์ Layout_weight

กรุณาตรวจสอบการเชื่อมโยงสำหรับรายละเอียดเพิ่มเติม


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

นี่อาจไม่ใช่สิ่งที่คุณกำลังมองหา (ไม่ใช่โซลูชัน "ง่าย" ในการส่งแท็บของคุณไปที่ด้านล่างของหน้าจอ) แต่ก็เป็นโซลูชันทางเลือกที่น่าสนใจที่ฉันต้องการตั้งค่าให้คุณ:

ScrollableTabHostถูกออกแบบมาเพื่อทำงานเหมือน TabHost แต่มี scrollview เพิ่มเติมเพื่อให้พอดีกับรายการเพิ่มเติม ...

อาจขุดลงในโครงการโอเพนซอร์ซนี้คุณจะพบคำตอบสำหรับคำถามของคุณ ถ้าฉันเห็นอะไรที่ง่ายกว่านี้ฉันจะกลับมาหาคุณ


1

ฉันมีปัญหาเดียวกันกับแท็บ android เมื่อพยายามวางไว้ที่ด้านล่างของหน้าจอ สถานการณ์ของฉันคือการไม่ใช้ไฟล์เลย์เอาต์และสร้างแท็บในโค้ดฉันยังมองหากิจกรรมจากแต่ละแท็บที่ดูซับซ้อนเกินไปโดยใช้วิธีการอื่น ๆ ดังนั้นนี่คือตัวอย่างโค้ดที่จะแก้ไขปัญหา:

เพิ่มแท็บในหุ่นยนต์และการวาง-พวกเขา


1

ใช่เห็น: ลิงค์แต่เขาใช้เลย์เอาต์ xml ไม่ใช่กิจกรรมเพื่อสร้างแท็บใหม่ดังนั้นให้วางโค้ด xml ของเขา (ตั้งค่า paddingTop สำหรับ FrameLayout - 0px) แล้วเขียนรหัส:

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

ฉันขอแนะนำให้ใช้รหัสนี้สำหรับการทำงานที่มั่นคงมันเหมาะสำหรับชิ้นส่วนที่ซ้อนกันในแท็บ (เช่น MapFragment ซ้อนกัน) และทดสอบกับ "อย่าเก็บกิจกรรม": https://stackoverflow.com/a/23150258/2765497

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.