12

करने के बाद शून्य है, वर्तमान में मेरे पास बाईं ओर ListFragment और दाईं ओर DetailsFragment (नीचे दिए गए टैबलेट पर लेआउट के समान) के साथ मेरा एप्लिकेशन सेट अप है।WebViewFragment webView एक FragmentTransaction

layout

विवरण टुकड़ा (टुकड़ा सूची के बगल में) मैं एक गोटो सौदा बटन, जो जब दबाया एक WebViewFragment साथ detailsFragment बदलना चाहिए है पर

मेरी समस्या यह है कि वेबव्यूफ्रैगमेंट में यूआरएल लोड करने का प्रयास करते समय WebView शून्य है।

WebViewFragment webViewFragment = new WebViewFragment(); 

FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack 
transaction.replace(R.id.deal_details_fragment, webViewFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit(); 

// Set the url 
if (webViewFragment.getWebView()==null) 
    Log.d("webviewfragment", "is null"); 
webViewFragment.getWebView().loadUrl("http://www.google.com"); 

नीचे मेरा मुख्य लेआउट है जिसमें मूल दो खंड परिभाषित हैं।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/main_activity_layout" 

    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 

    <fragment 
     android:name="com.bencallis.dealpad.DealListFragment" 
     android:id="@+id/deal_list_fragment" 
     android:layout_weight="1" 
     android:layout_width="0px" 
     android:layout_height="match_parent" > 
     <!-- Preview: [email protected]/deal_list_fragment --> 
    </fragment> 
    <fragment 
     android:name="com.bencallis.dealpad.DealDetailsFragment" 
     android:id="@+id/deal_details_fragment" 
     android:layout_weight="2" 
     android:layout_width="0px" 
     android:layout_height="match_parent" > 
     <!-- Preview: [email protected]/deal_details_fragment --> 
    </fragment> 

</LinearLayout> 

ऐसा लगता है कि पूरी तरह से webViewFragment बनाया जा रहा नहीं कर रहा है के रूप में WebView initialised नहीं किया गया है। मैंने ऑनलाइन देखा है लेकिन WebViewFragment के बारे में बहुत कम जानकारी है।

को सुनिश्चित करने के लिए कोई विचार WebViewFragment में शुरू किया गया है?

+0

अपने DealWebViewFragment वर्ग के लिए कोड पोस्ट करें। – Jonathan

+0

@ जोनाथन - क्षमा करें मेरा डीलवेब व्यूफ्रैगमेंट केवल वेब व्यूफ्रैगमेंट का पुनर्निर्माण था। मैंने ऊपर दिए गए कोड को वेबव्यूफ्रैगमेंट में बदल दिया है (वही समस्या मौजूद है)। – bencallis

उत्तर

12

एस्पिन्डेव से बहुत मदद के साथ मैंने एक काम कर रहे वेबव्यू प्राप्त करने में कामयाब रहा है। यह सुनिश्चित करने के लिए कि खंड में खोले गए लिंक और वेब ब्राउजर एप्लिकेशन में नहीं, मैंने एक सरल InnerWebView क्लाइंट बनाया जो WebViewClinet को बढ़ाता है।

public class DealWebViewFragment extends Fragment { 

    private WebView mWebView; 
    private boolean mIsWebViewAvailable; 
    private String mUrl = null; 

    /** 
    * Creates a new fragment which loads the supplied url as soon as it can 
    * @param url the url to load once initialised 
    */ 
    public DealWebViewFragment(String url) { 
     super(); 
     mUrl = url; 
    } 

    /** 
    * Called to instantiate the view. Creates and returns the WebView. 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     if (mWebView != null) { 
      mWebView.destroy(); 
     } 
     mWebView = new WebView(getActivity()); 
     mWebView.setOnKeyListener(new OnKeyListener(){ 


      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { 
         mWebView.goBack(); 
         return true; 
        } 
        return false; 
      } 

     }); 
     mWebView.setWebViewClient(new InnerWebViewClient()); // forces it to open in app 
     mWebView.loadUrl(mUrl); 
     mIsWebViewAvailable = true; 
     WebSettings settings = mWebView.getSettings(); 
     settings.setJavaScriptEnabled(true); 
     return mWebView; 
    } 

    /** 
    * Convenience method for loading a url. Will fail if {@link View} is not initialised (but won't throw an {@link Exception}) 
    * @param url 
    */ 
    public void loadUrl(String url) { 
     if (mIsWebViewAvailable) getWebView().loadUrl(mUrl = url); 
     else Log.w("ImprovedWebViewFragment", "WebView cannot be found. Check the view and fragment have been loaded."); 
    } 

    /** 
    * Called when the fragment is visible to the user and actively running. Resumes the WebView. 
    */ 
    @Override 
    public void onPause() { 
     super.onPause(); 
     mWebView.onPause(); 
    } 

    /** 
    * Called when the fragment is no longer resumed. Pauses the WebView. 
    */ 
    @Override 
    public void onResume() { 
     mWebView.onResume(); 
     super.onResume(); 
    } 

    /** 
    * Called when the WebView has been detached from the fragment. 
    * The WebView is no longer available after this time. 
    */ 
    @Override 
    public void onDestroyView() { 
     mIsWebViewAvailable = false; 
     super.onDestroyView(); 
    } 

    /** 
    * Called when the fragment is no longer in use. Destroys the internal state of the WebView. 
    */ 
    @Override 
    public void onDestroy() { 
     if (mWebView != null) { 
      mWebView.destroy(); 
      mWebView = null; 
     } 
     super.onDestroy(); 
    } 

    /** 
    * Gets the WebView. 
    */ 
    public WebView getWebView() { 
     return mIsWebViewAvailable ? mWebView : null; 
    } 

    /* To ensure links open within the application */ 
    private class InnerWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 


    } 

उम्मीद है कि यह भविष्य में किसी के लिए उपयोगी है।

0

टुकड़े केवल तभी बदला जा सकता है जब उन्हें जावा में प्रारंभ किया गया हो, एक्सएमएल नहीं। मुझे ऐसा लगता है, मुझे एक ही समस्या थी और इसे हल किया गया। यह करने के लिए अपने XML बदलें:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/main_activity_layout" 

    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 

    <fragment 
     android:name="com.bencallis.dealpad.DealListFragment" 
     android:id="@+id/deal_list_fragment" 
     android:layout_weight="1" 
     android:layout_width="0px" 
     android:layout_height="match_parent" > 
     <!-- Preview: [email protected]/deal_list_fragment --> 
    </fragment> 
    <View 
     android:id="@+id/my_container" 
     android:layout_weight="2" 
     android:layout_width="0px" 
     android:layout_height="match_parent" > 
    </View> 

</LinearLayout> 

और जावा में फिर, अपनी onCreate विधि:

FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.replace(R.id.my_container, new DealDetailsFragment()); 
transaction.commit(); 

या उनसे कहीं बेहतर Transaction रों से निपटने के लिए पूरे विधि पैदा करते हैं।

अब आपके प्रश्न से Transaction काम करना चाहिए। :)

+0

सहायता के लिए धन्यवाद। मैंने अपने लेआउट को एक दृश्य के साथ टुकड़े को बदल दिया है। । मेरी मुख्य गतिविधि में मैं निम्नलिखित \t \t FragmentTransaction लेनदेन = getFragmentManager() beginTransaction() जोड़ा गया; \t लेनदेन.रेप्लेस (आर.आईडी. राइट_फ्रेगमेंट_कैंटेनर, नया डील डिस्प्ले फ्रैगमेंट(), "सौदा विवरण विवरण"); \t लेनदेन.com(); दुर्भाग्य से इसका परिणाम जावा.लांग.क्लास कैस्ट एक्सेप्शन: android.view.View को एंड्रॉइड.व्यू पर नहीं देखा जा सकता है। व्यू ग्रुप – bencallis

+0

मैंने व्यू के बजाय लीनियरलाउट का उपयोग करके इस कास्ट अपवाद को सॉर्ट किया है। एप्लिकेशन अब चलता है लेकिन जब डील करने के लिए दबाया जाता है तो यूआरएल लोड नहीं किया जा सकता क्योंकि वेब व्यू अभी भी शून्य है। – bencallis

7

संपादित करें: इसलिए मैंने थोड़ी देर के लिए इसके साथ खेला और ऐसा लगता है कि डब्लूवीएफ थोड़ा कचरा है और इसे ओवरराइड करने के लिए डिज़ाइन किया गया है। हालांकि, इस पर कोई दस्तावेज नहीं है! समस्या Fragment के दृश्य से पहले getWebView() को कॉल करने के तथ्य से उत्पन्न होती है, इसलिए आपका NullPointerException है। सिगरेट के दृश्य को लोड होने पर पता लगाने का कोई तरीका नहीं है, इसलिए आप फंस गए हैं!

इसके बजाय मैं कक्षा को ओवरराइड करता हूं, बिट्स जोड़ता हूं और बिट्स बदलता हूं, ताकि अब यह ठीक काम करेगा। कोड के लिए this link देखें।

WebViewFragment webViewFragment = new WebViewFragment(); 

अपने टुकड़ा, उपयोग लोड करने के लिए:: तब उपयोग करने के बजाए

ImprovedWebViewFragment wvf = new ImprovedWebViewFragment("www.google.com"); 

इस वर्ग भी एक यूआरएल लोड करने के लिए एक सुविधा की विधि भी शामिल है, कि एक Exception हो, तो कोई फेंक नहीं होगा WebView

तो, नहीं, मुझे नहीं लगता कि अंतर्निहित WebViewFragment का उपयोग करने के लिए एक विशेष रूप से सरल तरीका है, लेकिन इसके बजाय काम करने के लिए यह बहुत आसान है। आशा करता हूँ की ये काम करेगा!

+0

मैं एंड्रॉइड वेबव्यूफ्रैगमेंट [लिंक] में निर्मित का उपयोग कर रहा हूं http://developer.android.com/reference/android/webkit/WebViewFragment.html। मैं अपना खुद का निर्माण करने में देख सकता हूं लेकिन निश्चित रूप से मुझे एक में निर्मित होना चाहिए। – bencallis

+0

ओह हाँ, क्षमा करें, इसका एहसास नहीं हुआ। आपके द्वारा पोस्ट किए गए कोड के साथ मुझे एक बेवकूफ़ होगा और देखें कि क्या मैं मदद कर सकता हूं। –

+0

धन्यवाद। क्या आपके पास कोई भाग्य है? – bencallis

3

वेबव्यूफ्रैगमेंट जैसा कि उपयोग करने के लिए सीधा नहीं है। इस सरल विस्तार (आप कॉपी कर सकते हैं/पेस्ट) का प्रयास करें:

public class UrlWebViewFragment extends WebViewFragment{ 

    private String url; 

    public static UrlWebViewFragment newInstance(String url) { 
     UrlWebViewFragment fragment = new UrlWebViewFragment(); 
     fragment.url = url; 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     WebView webView = (WebView) super.onCreateView(inflater, container, savedInstanceState); 
     webView.loadUrl(url); 
     return webView; 
    }   
    } 

कॉल जहां कारखाने विधि का उपयोग कर की जरूरत है:

WebViewFragment fragment = UrlWebViewFragment.newInstance("http://ur-url.com");