2017-06-13 111 views
2

我有4个片段,使用view-pager和tabs在主要活动中显示新闻。但是我的代码仅适用于第一个片段,即标签1Back按钮在WebView中无法按预期工作 - Android

在主要活动中,我有

@Override 
    public void onBackPressed() { 

     WebView mWebView = (WebView) findViewById(R.id.webview); 
     if (mWebView.getVisibility() == View.VISIBLE) { 
      mWebView.setVisibility(View.GONE); 
      mWebView.loadUrl("about:blank"); 
     } 
     else { 

      super.onBackPressed(); 
     } 

     return; 
    } 

当按下后退按钮,它通过采取用户返回到主布局隐藏web视图那里。它适用于选项卡1

但在片段2,3,4 - 当我按回按钮退出应用程序。我使用相同的代码作为片段1

我发现 - mWebView.getVisibility()== View.VISIBLE没有得到真正的 - 即使在网络视图是碎片2,3,4

可见

片段1个代码:

public class WSJFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<News>> { 


    ......... 


    public WSJFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.newsview, container, false); 

     ............ 

     NewsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
       // Find the current earthquake that was clicked on 
       News currentNews = mAdapter.getItem(position); 


       String newsUrl = currentNews.getUrl(); 

       progress.setVisibility(View.VISIBLE); 

       mWebView.setVisibility(View.VISIBLE); 

       mWebView.loadUrl(newsUrl); 

       mWebView.setWebViewClient(new WebViewClient() { 
        @Override 
        public void onPageFinished(WebView view, String url) { 
         super.onPageFinished(mWebView, url); 
         progress.setVisibility(View.GONE); 

        } 

       }); 


      } 


     }); 


     return rootView; 
    } 


    ........ 

} 

https://github.com/mrafz/W3News

+0

WebView mWebView =(WebView)findViewById(R.id.webview);应该像这样WebView mWebView =(WebView)inflaterView.findViewById(R.id.webview); –

+0

rootView = inflater.inflate(R.layout.newsview,container,false); mWebView =(WebView)rootView.findViewById(R.id.webview);我喜欢这个。这不是问题 – ams92

+0

好吧,但在OnBackPressed()您绑定Webview再次,而不是使用全球变量 –

回答

0

我已经在你的代码进行核对,使这一变化。

在MainActivity与此

@Override 
public void onBackPressed() { 

    if(mWebView != null){ 
     if (mWebView.getVisibility() == View.VISIBLE) { 
      mWebView.setVisibility(View.GONE); 
      mWebView.loadUrl("about:blank"); 
     }else { 
      finish(); 
     } 
    }else{ //if webview is null do something... here 
    } 
} 

在所有4个片段代替本

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.newsview, container, false); 

    MainActivity.mWebView = (WebView) rootView.findViewById(R.id.webview); 
    MainActivity.mWebView.setVisibility(View.GONE); 

    //your remaining code here 

return rootView; 
} 

并且在任何你找到“mWebView”对象替换每个片段取代它与MainActivity.mWebView

+0

我可以通过打开一个新的活动并将链接传递给该活动并从中打开webview来解决此问题。我也想到了为什么会发生这种情况,因为android在4个片段中的每一个片段中都创建了多个webview实例。所以它不能总是从父活动onBackPressed()中识别出哪一个,所以它找到它找到的第一个。即使你声明静态,它也是一样的,因为创建多个insance并将其存储在一个变量中。所以它不能区分4个Web视图实例 – ams92