2015-04-17 66 views
-1

爲什麼在我的活動「inflater和容器」沒有解決?我應該如何寫他們?無法解析充氣器和容器

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 

public class GamesFragment extends Fragment { 

private ProgressBar progress; 
private WebView myWebView; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    myUIUpdate(); 
    return null; 
} 

private void myUIUpdate() { 
    View rootView = inflater.inflate(R.layout.fragment_games, container, false); 


    String url = "http://gsmarena.com"; 
    myWebView = (WebView) rootView.findViewById(R.id.webViewGames); 
    myWebView.setWebChromeClient(new myWebViewClient()); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    progress = (ProgressBar) rootView.findViewById(R.id.progressBar); 
    myWebView.loadUrl(url); 
    progress.setMax(100); 


    myWebView.setWebViewClient(new WebViewClient() { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView View, String url) { 
      View.loadUrl(url); 
      GamesFragment.this.progress.setProgress(0); 
      return true; 
     } 

    }); 


    myWebView.setOnKeyListener(new android.view.View.OnKeyListener() 

    { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       WebView webView = (WebView) v; 

       switch (keyCode) { 
        case KeyEvent.KEYCODE_BACK: 
         if (webView.canGoBack()) { 
          webView.goBack(); 
          return true; 
         } 
         break; 
       } 
      } 

      return false; 
     } 
    }); 
    return rootView; 

} 


private class myWebViewClient extends WebChromeClient { 
    @Override 
    public void onProgressChanged(WebView view, int newProgress) { 
     GamesFragment.this.setValue(newProgress); 
     super.onProgressChanged(view, newProgress); 
    } 
} 

@Override 
public void setUserVisibleHint(boolean visible) { 
    super.setUserVisibleHint(visible); 
    if (visible && isResumed()) { 
     myUIUpdate(); 
    } 
} 

public void setValue(int progress) { 
    this.progress.setProgress(progress); 
} 


} 

我試圖附加myUIUdate,因爲它在屏幕上不可見使用此狀態下隱藏我的片段:

@Override 
public void setUserVisibleHint(boolean visible) { 
    super.setUserVisibleHint(visible); 
    if (visible && isResumed()) { 
     myUIUpdate(); 
    } 
    } 

PS:如果任何人有更好的主意來隱藏片段我愛聽。

+0

您能指出錯誤顯示的確切位置嗎?順便說一句,我看到充氣機和容器不是實例變量。你在哪裏初始化它們? – CKing

回答

1

Bacause在myUIUpdate()方法它沒有找到inflatercontainer .Therfore onCreateView寫入myUIUpdat E();作爲

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    myUIUpdate(inflater,container); 
} 

和變化在onViewCreated方法(更改return type也)作爲

private void myUIUpdate() { 

private View myUIUpdate(LayoutInflater inflater, ViewGroup container) { 

編輯myUIUpdate和從onCreateView除去儘可能

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


@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    myUIUpdate(view); 
} 

和重寫myUIUpdate方法

private void myUIUpdate(View view) { 
    String url = "http://gsmarena.com"; 
    myWebView = (WebView) view.findViewById(R.id.webViewGames); 
    myWebView.setWebChromeClient(new myWebViewClient()); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    progress = (ProgressBar) view.findViewById(R.id.progressBar); 
    myWebView.loadUrl(url); 
    progress.setMax(100); 

    myWebView.setWebViewClient(new WebViewClient() { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView View, String url) { 
      View.loadUrl(url); 
      GamesFragment.this.progress.setProgress(0); 
      return true; 
     } 

    }); 

    myWebView.setOnKeyListener(new android.view.View.OnKeyListener() {@Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       WebView webView = (WebView) v; 

       switch (keyCode) { 
        case KeyEvent.KEYCODE_BACK: 
         if (webView.canGoBack()) { 
          webView.goBack(); 
          return true; 
         } 
         break; 
       } 
      } 
      return false; 
     } 
    }); 
} 
+0

應用之後。 myUIUpdate();在 覆蓋 public void setUserVisibleHint(boolean visible){ super。setUserVisibleHint(可見); if(visible && isResumed()){ myUIUpdate();在GamesFragment }} 給我一個錯誤「myUIUpdate(layoutinflater,ViewGroup中)不能加入你的代碼後,適用於() – Rahul

+0

,應用程序崩潰看看日誌 E/AndroidRuntime(30911):顯示java.lang.NullPointerException :嘗試在空對象引用 – Rahul

+0

上調用虛擬方法'android.view.View android.view.View.findViewById(int)'再次在添加完編輯後的代碼後,gamesfragment中的myUpdate()視圖無法應用錯誤進來 boolean isResumed = FALSE; @Override 公共無效setUserVisibleHint(布爾isVisibleToUser){ super.setUserVisibleHint(isVisibleToUser); { 如果(isVisibleToUser && isResumed()){ myUIUpdate(); isResumed = true; } – Rahul

1

變化:

private void myUIUpdate() 

private void myUIUpdate(LayoutInflater inflater, ViewGroup container) 

,並通過充氣和容器它:

myUIUpdate(inflater, container); 
0

LayoutInflater吹氣,ViewGroup中容器,包savedInstanceState這些地方在您使用

0

無需創建定製的方法,並初始化所有視圖塊嘗試覆蓋onViewCreated並將所有myUIUpdate()代碼移至onViewCreated。

@Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.info_fragment, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     myWebView = (WebView) view.findViewById(R.id.webViewGames); 
     myWebView.setWebChromeClient(new myWebViewClient()); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     progress = (ProgressBar) view.findViewById(R.id.progressBar); 
     myWebView.loadUrl(url); 
     progress.setMax(100); 


     myWebView.setWebViewClient(new WebViewClient() { 

      @Override 
      public boolean shouldOverrideUrlLoading(WebView View, String url) { 
       View.loadUrl(url); 
       GamesFragment.this.progress.setProgress(0); 
       return true; 
      } 

     }); 


     myWebView.setOnKeyListener(new android.view.View.OnKeyListener() 

     { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (event.getAction() == KeyEvent.ACTION_DOWN) { 
        WebView webView = (WebView) v; 

        switch (keyCode) { 
         case KeyEvent.KEYCODE_BACK: 
          if (webView.canGoBack()) { 
           webView.goBack(); 
           return true; 
          } 
          break; 
        } 
       } 

       return false; 
      } 
     }); 
    } 
0

您在

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    myUIUpdate(); 
    return null; 
} 

得到inflatercontainer和他們在當地的存在。您必須將它們作爲參數傳遞給myUIUpdate,或者在Activity內聲明字段並將它們分配到onCreateView(這是一個醜陋的解決方案)。