Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TabHost打开多个选项卡_Android_Webview_Android Tabhost - Fatal编程技术网

Android TabHost打开多个选项卡

Android TabHost打开多个选项卡,android,webview,android-tabhost,Android,Webview,Android Tabhost,我已经实现了一个tabHost,它托管一些动态创建的Web视图。我想要的行为如下: 当应用程序启动时,我只希望显示一个选项卡,然后 在它里面,我希望我的URL被加载 当我在webview中单击链接时,我希望另一个选项卡被选中 已打开,我希望此选项卡显示新页面 因此,我想要的行为实际上就像一个支持多个选项卡的简单浏览器 我的代码是: @SuppressWarnings("deprecation") public class MainActivity extends TabActivity {

我已经实现了一个tabHost,它托管一些动态创建的Web视图。我想要的行为如下:

  • 当应用程序启动时,我只希望显示一个选项卡,然后 在它里面,我希望我的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