Android TabHost打开多个选项卡
我已经实现了一个tabHost,它托管一些动态创建的Web视图。我想要的行为如下:Android TabHost打开多个选项卡,android,webview,android-tabhost,Android,Webview,Android Tabhost,我已经实现了一个tabHost,它托管一些动态创建的Web视图。我想要的行为如下: 当应用程序启动时,我只希望显示一个选项卡,然后 在它里面,我希望我的URL被加载 当我在webview中单击链接时,我希望另一个选项卡被选中 已打开,我希望此选项卡显示新页面 因此,我想要的行为实际上就像一个支持多个选项卡的简单浏览器 我的代码是: @SuppressWarnings("deprecation") public class MainActivity extends TabActivity {
- 当应用程序启动时,我只希望显示一个选项卡,然后 在它里面,我希望我的URL被加载李>
- 当我在webview中单击链接时,我希望另一个选项卡被选中 已打开,我希望此选项卡显示新页面
@SuppressWarnings("deprecation")
public class MainActivity extends TabActivity {
public TabActivity act=this;
private String startUrl="myUrl";
public ArrayList<TabHost.TabSpec> list = new ArrayList<TabHost.TabSpec>();
public int counter=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createTab(startUrl);
}
private void createTab(String url) {
TabHost tabs = getTabHost();
TabSpec spec=tabs.newTabSpec(Integer.toString(counter));
spec.setIndicator(Integer.toString(counter));
counter++;
spec.setContent(new MyTabContentFactory(url));
list.add(spec);
tabs.addTab(spec);
tabs.setCurrentTabByTag(spec.getTag());
}
public class MyTabContentFactory implements TabContentFactory{
private String url;
public MyTabContentFactory(String url) {
this.url=url;
}
@Override
public View createTabContent(String tag) {
WebView browser=new WebView(act);
browser.setWebViewClient(new MyWebViewClient());
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setBuiltInZoomControls(true);
browser.loadUrl(url);
return (browser);
}
}
public class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
createTab(url);
return false;
}
}
@Override
public void onBackPressed() {
TabHost tabs = getTabHost();
int id=tabs.getCurrentTab();
list.remove(id); // remove it from memory
tabs.clearAllTabs(); // clear all tabs from the tabhost
if(list.size()>0)
for(TabHost.TabSpec spec : list) // add all that you remember back
tabs.addTab(spec);
else
act.finish();
}
}
@SuppressWarnings(“弃用”)
公共类MainActivity扩展了TabActivity{
公共活动法=此;
私有字符串startUrl=“myUrl”;
public ArrayList list=new ArrayList();
公共整数计数器=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createTab(startUrl);
}
私有void createTab(字符串url){
TabHost tabs=getTabHost();
TabSpec spec=tabs.newTabSpec(整数.toString(计数器));
规格设置指示器(整型toString(计数器));
计数器++;
spec.setContent(新的MyTabContentFactory(url));
列表。添加(规范);
tabs.addTab(spec);
tabs.setCurrentTabByTag(spec.getTag());
}
公共类MyTabContentFactory实现了TabContentFactory{
私有字符串url;
公共MyTabContentFactory(字符串url){
this.url=url;
}
@凌驾
公共视图createTabContent(字符串标记){
网络视图浏览器=新网络视图(act);
setWebViewClient(新的MyWebViewClient());
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setBuilTinZoomControl(true);
loadUrl(url);
返回(浏览器);
}
}
公共类MyWebViewClient扩展了WebViewClient{
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
createTab(url);
返回false;
}
}
@凌驾
public void onBackPressed(){
TabHost tabs=getTabHost();
int id=tabs.getCurrentTab();
list.remove(id);//从内存中删除它
tabs.clearAllTabs();//从tabhost中清除所有选项卡
如果(list.size()>0)
for(TabHost.TabSpec:list)//添加所有您记得的内容
tabs.addTab(spec);
其他的
完成动作;
}
}
此代码的行为如下:
@SuppressWarnings("deprecation")
public class MainActivity extends TabActivity {
public TabActivity act=this;
private String startUrl="myUrl";
public ArrayList<TabHost.TabSpec> list = new ArrayList<TabHost.TabSpec>();
public int counter=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createTab(startUrl);
}
private void createTab(String url) {
TabHost tabs = getTabHost();
TabSpec spec=tabs.newTabSpec(Integer.toString(counter));
spec.setIndicator(Integer.toString(counter));
counter++;
spec.setContent(new MyTabContentFactory(url));
list.add(spec);
tabs.addTab(spec);
tabs.setCurrentTabByTag(spec.getTag());
}
public class MyTabContentFactory implements TabContentFactory{
private String url;
public MyTabContentFactory(String url) {
this.url=url;
}
@Override
public View createTabContent(String tag) {
WebView browser=new WebView(act);
browser.setWebViewClient(new MyWebViewClient());
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setBuiltInZoomControls(true);
browser.loadUrl(url);
return (browser);
}
}
public class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
createTab(url);
return false;
}
}
@Override
public void onBackPressed() {
TabHost tabs = getTabHost();
int id=tabs.getCurrentTab();
list.remove(id); // remove it from memory
tabs.clearAllTabs(); // clear all tabs from the tabhost
if(list.size()>0)
for(TabHost.TabSpec spec : list) // add all that you remember back
tabs.addTab(spec);
else
act.finish();
}
}
- 一旦打开,我的url将正确加载
- 当我在链接上单击时,会创建新选项卡并加载页面,但第一个选项卡现在也会加载新页面
- 第二个问题是自动打开另一个选项卡李>
@SuppressWarnings(“弃用”)
公共类MainActivity扩展了TabActivity{
私有最终静态字符串TAG=“MainActivity”;
公共活动法=此;
私有最终静态字符串startUrl=”http://www.myurl.com";
private ArrayList list=new ArrayList();
专用整数计数器=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(标记“onCreate”);
if(list.size()==0)
createTab(startUrl);
否则{
TabHost tabs=getTabHost();
tabs.clearAllTabs();//从tabhost中清除所有选项卡
for(TabHost.TabSpec:list)//添加所有您记得的内容
tabs.addTab(spec);
}
}
@凌驾
受保护的void onStart(){
super.onStart();
Log.i(标记“onStart”);
}
@凌驾
受保护的void onRestart(){
super.onRestart();
Log.i(标签“onRestart”);
}
@凌驾
受保护的void onResume(){
super.onResume();
Log.i(标签“onResume”);
}
@凌驾
受保护的void onPause(){
super.onPause();
Log.i(标记“onPause”);
}
@凌驾
受保护的void onStop(){
super.onStop();
Log.i(标记为“顶部”);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
Log.i(标签“onDestroy”);
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
Log.i(标记“onSaveInstanceState”);
}
@凌驾
RestoreInstanceState上的受保护无效(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
Log.i(标记“onRestoreInstanceState”);
}
私有void createTab(字符串url){
Log.i(标记“createTab”);
TabHost tabs=getTabHost();
TabSpec spec=tabs.newTabSpec(整数.toString(计数器));
规格设置指示器(整型toString(计数器));
spec.setContent(新的MyTabContentFactory(url));
列表。添加(规范);
tabs.addTab(spec);
tabs.setCurrentTab(计数器);
计数器++;
}
@凌驾
public void onBackPressed(){
Log.i(标签“onBackPressed”);
TabHost tabs=getTabHost();
int id=tabs.getCurrentTab();
list.remove(id);//从内存中删除它
计数器--;
tabs.clearAllTabs();//从tabhost中清除所有选项卡
int指标=0;
如果(list.size()>0)
对于(TabHost.TabSpec:list){//添加所有您记得的内容
spec.setIndicator(Integer.toString(indicator));
指标++;
tabs.addTab(spec);
}
其他的
完成动作;
}
公共类MyTabContentFactory imp