2015-11-04 18 views
1

我演示了有關父活動中兩個片段的通信。這是我的代碼片段溝通拋出空指針異常

WebListFragment

public class WebListFragment extends Fragment implements AdapterView.OnItemClickListener { 

    private List<String> list = new ArrayList<String>(); 
    private ListView listView; 
    private ArrayAdapter<String> adapter; 
    ListItemListener itemListener; 

    public interface ListItemListener{ 
     void itemClick(String url); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     itemListener = (ListItemListener) activity; 
    } 

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

     View view = inflater.inflate(R.layout.web_list_fragment, container, false); 

     listView = (ListView) view.findViewById(R.id.listWeb); 
     list.add("https://www.youtube.com/"); 
     list.add("http://news.zing.vn/"); 
     list.add("http://hdonline.vn/"); 

     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); 
     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(this); 

     return view; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     itemListener.itemClick(list.get(position)); 
    } 

} 

WebContentFragment

public class WebContentFragment extends Fragment{ 
    WebView webView; 
    View view ; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = (LinearLayout)inflater.inflate(R.layout.web_content_fragment, container, false); 
     webView = (WebView) this.getView().findViewById(R.id.webView); 
     return view; 
    } 

    public void setUrl(String url, Context context){ 

     webView.loadUrl(url); 
     Log.d("FF", "ABC"); 
    } 

} 

WebFragmentActivity

public class WebFragmentActivity extends AppCompatActivity implements WebListFragment.ListItemListener{ 

    private Fragment fragmentWebList; 
    private Fragment fragmentWebContent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_web_fragment); 

    } 

    @Override 
    public void itemClick(String url) { 
     WebContentFragment fragment = new WebContentFragment(); 
     fragment.setUrl(url,this); 
    } 
} 

這是我的問題,當調用方法setUrlWebConte ntFragment在LogCat中導致空指針異常。當我在這種方法調試我看到視圖和webView等於null雖然我給他們分配onCreateView。我不知道爲什麼會發生這種情況。你能向我展示造成這個問題的原因和解決辦法嗎?由於

我的logcat:

java.lang.NullPointerException 
      at com.nguyen.fragment.WebFragment.WebContentFragment.setUrl(WebContentFragment.java:61) 
      at com.nguyen.fragment.WebFragment.WebFragmentActivity.itemClick(WebFragmentActivity.java:24) 
      at com.nguyen.fragment.WebFragment.WebListFragment.onItemClick(WebListFragment.java:55) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1086) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855) 
      at android.widget.AbsListView$1.run(AbsListView.java:3529) 
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4745) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

您必須將偵聽器設置爲相應的片段。 –

+0

還請指定您要從活動 –

回答

1

我所知,LayoutInflater.inflate()不能返回null,它可以返回視圖或拋一個例外,但不爲空。

不管怎麼說,這條線:

webView = (WebView) this.getView().findViewById(R.id.webView); 

應該是:

webView = (WebView) view.findViewById(R.id.webView); 

您對getView()方法返回null,因爲它給你)

由onCreateView(返回查看呼叫而且,這個視圖類變量沒有意義,Fragment類已經存儲了它的根視圖。

希望這會有所幫助。

編輯

什麼是null它的片段對象。

來自Ashish Agrawal的片段創建代碼在下面的答案看起來像是一個適當的解決方案。

您需要創建片段並將其連接到活動前,你可以調用setUrl()

+0

中調用片段的位置,謝謝。我試過你的解決方案,但它沒有工作。它仍然會導致空指針異常 –

+0

您可以發佈完整的logcat輸出嗎? – Nanoc

+0

我只是我的帖子包括logcat在那裏 –

1

負載活性然後設置值首先片段

public class WebFragmentActivity extends AppCompatActivity implements WebListFragment.ListItemListener{ 

    private Fragment fragmentWebList; 
    private Fragment fragmentWebContent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_web_fragment); 
     loadFragment(fragmentWebContent,"WebContentFragmnet"); 
    } 

    @Override 
    public void itemClick(String url) { 

     ((WebContentFragment)fragmentWebContent).setUrl(url,this); 
    } 

    private void loadFragment(Fragment fragment,String tag){ 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.replace(R.id.container, fragment, tag); 
     ft.addToBackStack(tag); 
     ft.commit(); 
    } 
} 
1

片段離不開活動存在。您創建了新的 WebContentFragment,而不是WebFragmentActivity中的一個,並且您沒有將它附加到Activity,因此onCreateView未被調用,因此webView爲null。我假設你有WebContentFragment在你的活動佈局致電

WebContentFragment webContentFragment = (WebContentFragment) getSupportFragmentManager().findFragmentById(R.id.your_id); 
webContentFragment .setUrl(url,this); 

這樣得到的佈局片段,其中在WebFragmentActivity佈局your_id WebContentFragment片段ID。

+0

謝謝你。我遵循你的方式,我工作得很好 –