【背景】
折腾:
期间,需要去实现,动态创建多个TAB页面。
【折腾过程】
1.google搜:
android dynamic create tab
然后参考:
TabView (Part4) – Create dynamic content in tab at run time | Android Tech
看到其用到TabHost,所以去查查。
2.参考:
新浪微博布局学习——妙用TabHost – 农民伯伯 – 博客园
Android TabHost的使用 – hpoi的专栏 – 博客频道 – CSDN.NET
最全的Android的Tab与TabHost讲解 – Android实例教程 – Android开发论坛 – 安卓开发论坛 – Android开发 – 安卓论坛 – 移动互联网门户
但是是用xml去定义固定的tab的。不是我要的。
3.关于动态创建Tab的,找到:
[1/2] Android学习笔记之——TabHost动态增加与删除与更新 | K-Beta
示例代码是:
tabhost.addTab(tabhost.newTabSpec("tab" + j).setIndicator(mytabviewlist.get(j)) .setContent(Mytabfirst.this));//这里就是intent tabhost.setCurrentTab(j);
但是还是没太大帮助。
4.算了,去参考:
去试试TabHost。
结果:
tabHost = getTabHost();
中找不到getTabHost。
5.另外参考:
TabView (Part 1) – Simple tab control in Android | Android Tech
把概念解释的很清晰。去好好看看。
6.参考:
Android dynamic TAB Control « PocketMagic
去试试。
结果用代码:
// -- check screen orientation -- // m_display = getWindowManager().getDefaultDisplay(); m_nScreenW = m_display.getWidth(); m_nScreenH = m_display.getHeight(); // create interface View m_vForm; if (m_nScreenW <= m_nScreenH) m_vForm = _createTABForm(); // portrait interface else m_vForm = _createEmptyForm(); // landscape interface // show the panel on the screen setContentView(m_vForm); } /** Create the TAB interface */ @SuppressWarnings("deprecation") private ViewGroup _createTABForm() { // construct the TAB Host TabHost tabHost = new TabHost(this); tabHost.setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); // the tabhost needs a tabwidget, that is a container for the visible tabs TabWidget tabWidget = new TabWidget(this); tabWidget.setId(android.R.id.tabs); tabHost.addView(tabWidget, new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); // the tabhost needs a frame layout for the views associated with each visible tab FrameLayout frameLayout = new FrameLayout(this); frameLayout.setId(android.R.id.tabcontent); frameLayout.setPadding(0, 65, 0, 0); tabHost.addView(frameLayout, new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); // setup must be called if you are not initialising the tabhost from XML tabHost.setup(); // create the tabs TabSpec ts1 = tabHost.newTabSpec("TAB_TAG_1"); ts1.setIndicator("TAB-1"); ts1.setContent(new TabHost.TabContentFactory(){ public View createTabContent(String tag) { // -- this tab contains multiple control grouped in a panel -- // LinearLayout panel = new LinearLayout(MainActivity.this); panel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); panel.setOrientation(LinearLayout.VERTICAL); // Userid : label and text field TextView lblUserid = new TextView(MainActivity.this); lblUserid.setText("The label above the EditText"); lblUserid.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f); lblUserid.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); EditText ttfUserid = new EditText(MainActivity.this); ttfUserid.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); // login button final Button btnLogin = new Button(MainActivity.this); btnLogin.setText("Login"); btnLogin.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); btnLogin.setGravity(Gravity.CENTER); btnLogin.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Log.d("pocketmagic.net", "_createForm click but"); } }); // actually adding the views to the panel // userid panel.addView(lblUserid); panel.addView(ttfUserid); // loginbutton panel.addView(btnLogin); return panel; } //TAB 1 done }); tabHost.addTab(ts1); // // TabSpec ts2 = tabHost.newTabSpec("TAB_TAG_2"); // ts2.setIndicator("TAB-2"); // ts2.setContent(new TabHost.TabContentFactory(){ // public View createTabContent(String tag) // { // // -- this tab contains a single control - the listview -- // // ListView ls1 = new ListView(MainActivity.this); // ArrayAdapter<String> adapter = new ArrayAdapter<String>( // MainActivity.this, // android.R.layout.simple_list_item_1, // new String[]{"item1","item2","item3","item4","item5","item6","item7"}); // ls1.setAdapter(adapter); // ls1.setOnCreateContextMenuListener(MainActivity.this); // return ls1; // } // }); // tabHost.addTab(ts2); // // TabSpec ts3 = tabHost.newTabSpec("TAB_TAG_3"); // ts3.setIndicator(" "); // ts3.setContent(new TabHost.TabContentFactory(){ // public View createTabContent(String tag) // { // // -- this tab contains a single control - a textview -- // // TextView textAbout = new TextView(MainActivity.this); // textAbout.setText("About this sample\n\nThis is the Dynamic TAB control sample for Android.\n\n(C)2010 Radu Motisan\[email protected]\nwww.pocketmagic.net"); // textAbout.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f); // textAbout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); // return textAbout; // } // }); // tabHost.addTab(ts3); // // -- set the image for tab3, can be used after tab has been created too -- // // ImageView iv = (ImageView)tabHost.getTabWidget().getChildAt(2).findViewById(android.R.id.icon); // if (iv != null) iv.setImageDrawable(getResources().getDrawable(R.drawable.icon)); return tabHost; } /** Create the empty interface for landscape*/ private View _createEmptyForm() { TextView text = new TextView(this); text.setText("The interface is only available in PORTRAIT mode! Do the switch :-)"); text.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f); text.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); return text; }
却挂掉了。
7.
这里:
解释了静态的TAB和动态的TAB的逻辑:
tab组件是:TabWidget
(1)静态使用tab:
用xml定义好对应的布局
创建一个TabHost.TabSpec
然后再调用setContent()
示例代码:
TabHost.TabSpec spec=tabs.newTabSpec(“buttontab”); spec.setContent(R.id.buttontab); spec.setIndicator(“Button”); tabs.addTab(spec);
(2)动态使用tab:
和静态的很类似:
唯一不同的只是
setContent()
时传入的是的TabHost.TabContentFactory
实例
提供一个对应的createTabContent()
的callback,返回view即可。
8.官网:
没有解释清楚,如何去动态的添加tab。
9.再去看:
TabWidget | Android Developers
还是没思路。
10.最后还是参考:
TabView (Part 1) – Simple tab control in Android | Android Tech
而用如下代码:
import android.widget.TabHost; import android.widget.TabHost.TabSpec; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TabHost tabHost=(TabHost)findViewById(R.id.tabHost); tabHost.setup(); TabSpec spec1=tabHost.newTabSpec("Tab 1"); spec1.setContent(R.id.tab1); spec1.setIndicator("Tab 1"); TabSpec spec2=tabHost.newTabSpec("Tab 2"); spec2.setIndicator("Tab 2"); spec2.setContent(R.id.tab2); TabSpec spec3=tabHost.newTabSpec("Tab 3"); spec3.setIndicator("Tab 3"); spec3.setContent(R.id.tab3); tabHost.addTab(spec1); tabHost.addTab(spec2); tabHost.addTab(spec3); }
对应xml是:
/res/layout/activity_main.xml
内容为:
<?xml version="1.0" encoding="utf-8"?> <TabHost android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tabHost" xmlns:android="http://schemas.android.com/apk/res/android"> <TabWidget android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@android:id/tabs"/> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabcontent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/tab1" android:orientation="vertical" android:paddingTop="60px"> <TextView android:layout_width="fill_parent" android:layout_height="100px" android:text="This is tab1" android:id="@+id/txt1"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tab2" android:orientation="vertical" android:paddingTop="60px"> <TextView android:layout_width="fill_parent" android:layout_height="100px" android:text="This is tab 2" android:id="@+id/txt2"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tab3" android:orientation="vertical" android:paddingTop="60px"> <TextView android:layout_width="fill_parent" android:layout_height="100px" android:text="This is tab 3" android:id="@+id/txt3"/> </LinearLayout> </FrameLayout> </TabHost>
然后可以显示出对应的三个TAB了:
11.然后再继续参考教程:
TabView (Part4) – Create dynamic content in tab at run time | Android Tech
去改为动态添加tab:
TabHost tabHost=(TabHost)findViewById(R.id.tabHost); tabHost.setup(); TabSpec spec1=tabHost.newTabSpec("Tab1"); spec1.setContent(new TabHost.TabContentFactory() { public View createTabContent(String tag) { TextView txtView = new TextView(MainActivity.this); txtView.setText("Tab Text in createTabContent"); return txtView; } }); spec1.setIndicator("Tab Text for setIndicator"); TabSpec spec2=tabHost.newTabSpec("Tab2"); spec2.setIndicator("Tab Clock"); spec2.setContent(new TabHost.TabContentFactory() { public View createTabContent(String tag) { return(new AnalogClock(MainActivity.this)); } }); spec2.setIndicator("Clock"); tabHost.addTab(spec1); tabHost.addTab(spec2);
效果如下:
【总结】
此处,很明显是第一个tab添加后,text显示位置有误,但是暂时不去深究。
总之对于动态添加tab的功能,是实现了。
总结如下:
去
/res/layout/activity_main.xml
建立对应的布局配置:
<?xml version="1.0" encoding="utf-8"?> <TabHost android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tabHost" xmlns:android="http://schemas.android.com/apk/res/android"> <TabWidget android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@android:id/tabs"/> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabcontent"> </FrameLayout> </TabHost>
然后去代码中,动态添加tab:
import android.view.Menu; import android.view.View; import android.widget.AnalogClock; import android.widget.TabHost; import android.widget.TabHost.TabSpec; import android.widget.TextView; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TabHost tabHost=(TabHost)findViewById(R.id.tabHost); tabHost.setup(); TabSpec spec1=tabHost.newTabSpec("Tab1"); spec1.setContent(new TabHost.TabContentFactory() { public View createTabContent(String tag) { TextView txtView = new TextView(MainActivity.this); txtView.setText("Tab Text in createTabContent"); return txtView; } }); spec1.setIndicator("Tab Text for setIndicator"); TabSpec spec2=tabHost.newTabSpec("Tab2"); spec2.setIndicator("Tab Clock"); spec2.setContent(new TabHost.TabContentFactory() { public View createTabContent(String tag) { return(new AnalogClock(MainActivity.this)); } }); spec2.setIndicator("Clock"); tabHost.addTab(spec1); tabHost.addTab(spec2); }
即可。
转载请注明:在路上 » 【已解决】Android中动态创建多个TAB页面