android - 具有相同类的嵌套标签栏

标签 android android-layout android-intent android-fragments tabs

nested tab bar with dynamic value

大家好,我在用不同的值调用标签栏事件时遇到了问题。因为标签栏 View 在单个调用中加载。无法为类传递不同的值。例如,我必须加载 fri17、sat18、sun19 标签在选项卡栏类上。它的内容为第 17 天值、第 18 天值、第 19 天值。在将日期 17 传递到列表类后必须在 ListView 中加载。我尝试了更改监听器上的选项卡。仍然找不到解决这个问题的方法。有人能帮忙吗我。

package com.androidexample.tabbar;




 import java.util.ArrayList;
import java.util.HashMap;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class TabBar extends TabActivity implements OnTabChangeListener{
public static String name;

static final String URL =         "http://182.160.161.2/~mani/homeshow/web_serv/timeTableGetByRequest.php?event_id=14&sortBy=time";

static final String KEY_SONG = "date"; // parent node
static final String KEY_IDs = "timetable_date";
public HashMap<String, String> map;
public ArrayList<HashMap<String, String>> songsList;
String kid,ktit,kart,kdur,kurl,EID;

TabHost tabHost;
TabHost.TabSpec spec;
Intent intent;

  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.t2);


      tabHost = getTabHost();
 tabHost.setOnTabChangedListener(this);





     songsList = new ArrayList<HashMap<String, String>>();

    final NewProdCompleteXMLParser parser = new NewProdCompleteXMLParser();
    String xml = parser.getXmlFromUrl(URL); 
    final Document doc = parser.getDomElement(xml);

    NodeList nl = doc.getElementsByTagName(KEY_SONG);

    for (int i = 0; i < nl.getLength(); i++) {

     map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);

        map.put(KEY_IDs, parser.getValue(e, KEY_IDs));



        songsList.add(map);

        kid=parser.getValue(e, KEY_IDs);
        System.out.println("kid"+kid);


        intent = new Intent().setClass(this, Tab1.class);    
        spec= tabHost.newTabSpec("hhj").setIndicator(kid)
         .setContent(intent);

           tabHost.addTab(spec);
           tabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.tab_bg);
            TextView tv = (TextView) tabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); 
             tv.setTextColor(Color.WHITE);

    }


    tabHost.getTabWidget().setCurrentTab(0);
      tabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.tab_hover);


   }


    public void onTabChanged(String tabId) {
name=songsList.get(tabHost.getCurrentTab()).get("timetable_date");
System.out.println("on tab changed"+name);




    /************ Called when tab changed *************/

    //********* Check current selected tab and change according images *******/


    for(int i=0;i<tabHost.getTabWidget().getChildCount();i++)
    {




        tabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.tab_bg);  
    }


    for(int i=0;i<tabHost.getTabWidget().getChildCount();i++)
        {



        tabHost.getTabWidget().getChildAt(tabHost.getCurrentTab()).setBackgroundResource(R.drawable.tab_hover);         
        }

    Log.i("tabs", "CurrentTab: "+tabHost.getCurrentTab());

    while(tabHost.getCurrentTab()==1)
    {

        Intent  intent1 = new Intent().setClass(this, Tab1.class);   
        spec.setContent(intent1);
              //Add intent to tab

        System.out.println("on tab changed"+name);
        tabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.tab_bg);  
    }


}

}

必须发送 System.out.println("on tab changed"+name);。这个名字 val(ie.fri17..sat 18.on each tab click to next Tab1 class)

public class Tab1 extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab1);

        TabBar tb=new TabBar();
        String name = tb.name;
        System.out.println("on tab changed TT"+name);
     }
}

最佳答案

你有两个更好的 android 特定选项

1>使用 JakeWharton 的 Android-ViewPagerIndicator

2>非常有名的 astuetz PagerSlidingTabStrip

使用这个库和示例做一些 hack 以在您的每个父选项卡中加载这些 amples Activity 或 fragment 。

除此之外你还可以做two way communication between a TabActivity (即托管 TabHost 的 Activity )及其各自的子选项卡(每个选项卡内的 Activity )。

布局要点代码:

<?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">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:tag="tab0"
android:text="Tab 1"
android:background="@android:drawable/btn_star_big_on"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
<TextView
android:tag="tab1"
android:text="Tab 2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
<TextView
android:tag="tab2"
android:text="Tab 3"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="Hallo1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:text="Hallo2"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:text="Hallo3"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
</LinearLayout>
</TabHost>

Activity :

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TabHost;
import android.widget.TabHost.TabContentFactory;
import android.widget.TabHost.TabSpec;
import android.widget.TabWidget;
import android.widget.TextView;

public class SensorActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabsample);
TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
final TabWidget tabWidget = tabHost.getTabWidget();
final FrameLayout tabContent = tabHost.getTabContentView();
// Get the original tab textviews and remove them from the viewgroup.
TextView[] originalTextViews = new TextView[tabWidget.getTabCount()];
for (int index = 0; index < tabWidget.getTabCount(); index++) {
originalTextViews[index] = (TextView) tabWidget.getChildTabViewAt(index);
}
tabWidget.removeAllViews();
// Ensure that all tab content childs are not visible at startup.
for (int index = 0; index < tabContent.getChildCount(); index++) {
tabContent.getChildAt(index).setVisibility(View.GONE);
}
// Create the tabspec based on the textview childs in the xml file.
// Or create simple tabspec instances in any other way...
for (int index = 0; index < originalTextViews.length; index++) {
final TextView tabWidgetTextView = originalTextViews[index];
final View tabContentView = tabContent.getChildAt(index);

TabSpec tabSpec = tabHost.newTabSpec((String) tabWidgetTextView.getTag());
tabSpec.setContent(new TabContentFactory() {
@Override
public View createTabContent(String tag) {
return tabContentView;
}
});
if (tabWidgetTextView.getBackground() == null) {
tabSpec.setIndicator(tabWidgetTextView.getText());
} else {
tabSpec.setIndicator(tabWidgetTextView.getText(), tabWidgetTextView.getBackground());
}
tabHost.addTab(tabSpec);
}
// tabHost.setCurrentTab(0);
}   
}

来源:gist

关于android - 具有相同类的嵌套标签栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21250613/

相关文章:

android - 更改安卓代理设置

java - 在 Android 中调用随机方法

android - 多个动画的相同插值器

android - 滑动屏幕时带有移动物体的欢迎屏幕

android - 回收 View 在 ScrollView/NestedScrollView 中不起作用

Android 写入默认短信应用

java - 使用 Activity 类中的方法

Android SearchView 无法在 fragment 中工作

c# - 响应 BinaryWrite 不适用于 Android 浏览器

android - 用于获取运算符(operator)分配的 IP 地址的 adb 命令