【问题标题】:cant seem to pass params to constructor似乎无法将参数传递给构造函数
【发布时间】:2012-03-27 15:30:03
【问题描述】:

我有一个 CustomWebViewClass:

import android.app.Activity;
import android.content.Intent;

import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class CustomWebView extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        String url = intent.getStringExtra("url");

        WebView webview = new WebView(this);
        setContentView(webview);
        webview.getSettings().setJavaScriptEnabled(true);

        //progress bar optional
        getWindow().requestFeature(Window.FEATURE_PROGRESS);

        final Activity activity = this;
        Toast.makeText(activity, "YO! " + url, Toast.LENGTH_SHORT).show();
        webview.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                // Activities and WebViews measure progress with different scales.
                // The progress meter will automatically disappear when we reach 100%
                activity.setProgress(progress * 1000);
            }
        });
        webview.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
            }
        });

        webview.loadUrl(url);
    }
}

从另一个类(本质上是一个按钮)我试图调用这个类作为向它传递一个 URL 的意图,如下所示:

Intent webView = new Intent(getContext(), CustomWebView.class);
webView.putExtra("url", "http://google.com");
webView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(webView);

但我得到一个黑屏或错误.. 显然我做错了什么,请帮助

哦,我的清单有这个:

<activity android:name=".CustomWebView"
    android:label="CustomWebView"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:screenOrientation="landscape">
    <intent-filter>
        <action android:name="com.sapientnitro.lcinstore2.CUSTOMWEBVIEW" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

【问题讨论】:

    标签: android android-intent webview


    【解决方案1】:

    requestFeature() 应该在setContentView 之前调用:

    ...

    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(webview);
    

    ...

    【讨论】:

      【解决方案2】:

      您不是使用参数调用它,而是在启动一个活动并将一个额外的字符串放入意图包中,而您永远不会从包中拉出使用。

      CustomWebView开头需要这样的东西:

      Bundle extras = getIntent().getExtras();
      String url = extras.getString("url");
      

      【讨论】:

        【解决方案3】:

        您似乎误解了 Activity 的构造函数与其onCreate() 方法之间的区别。

        当你显式创建一个新对象时会调用构造函数;

        Activity customWebView = new CustomWebView(url);
        

        这可能不是您想要创建新活动的方式。相反,您想使用意图系统(这是您已经开始做的)。

        Intent webView = new Intent(getContext(), CustomWebView.class);
        webView.putExtra("url", "http://google.com");
        webView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getContext().startActivity(webView);
        

        使用 Intent 系统会调用一个空的构造函数,然后一旦创建了 Activity,就会调用 onCreate() 方法,你应该重写它。从这里,您可以访问用于启动 Activity 的 Intent,并且可以获取您作为参数传递的 URL。

        你可能想要这样的东西:

        public class CustomWebView extends Activity {
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                Intent intent = getIntent();
                String url = intent.getStringExtra("url");
        
                //Do stuff with your URL
            }
        }
        

        【讨论】:

        • 我更新了上面的代码以反映您的答案并收到此错误:03-27 10:59:17.830: E/AndroidRuntime(6870): java.lang.RuntimeException: Unable to start activity ComponentInfo {com.sapientnitro.lcinstore2/com.sapientnitro.lcinstore2.CustomWebView}: android.util.AndroidRuntimeException: requestFeature() 必须在添加内容之前调用 03-27 10:59:17.830: E/AndroidRuntime(6870): 原因: android.util.AndroidRuntimeException: requestFeature() 必须在添加内容之前调用
        • 错误是“添加内容前必须调用requestFeature()”。您必须先致电getWindow().requestFeature(Window.FEATURE_PROGRESS);,然后再致电setContentView(webview);
        【解决方案4】:

        当您在Intent 上传递params 时,您可以使用getIntent().getExtra[...] 检索它

        试试这个:

        import android.app.Activity;
        
        import android.view.Window;
        import android.webkit.WebChromeClient;
        import android.webkit.WebView;
        import android.webkit.WebViewClient;
        import android.widget.Toast;
        
        public class CustomWebView extends Activity{
        
            @Override
            public void onCreate(Bundle savedInstanceState) 
            {
                super.onCreate(savedInstanceState);
                String url = getIntent().getStringExtra("url");
        
                 //super.onCreate(savedInstanceState);
        
        
                 WebView webview = new WebView(this);
                 setContentView(webview); 
                //progress bar optional
                 getWindow().requestFeature(Window.FEATURE_PROGRESS);
                // alllow js
                 webview.getSettings().setJavaScriptEnabled(true);
        
                 final Activity activity = this;
                 Toast.makeText(activity, "YO! " + url, Toast.LENGTH_SHORT).show();
                 webview.setWebChromeClient(new WebChromeClient() {
                   public void onProgressChanged(WebView view, int progress) {
                     // Activities and WebViews measure progress with different scales.
                     // The progress meter will automatically disappear when we reach 100%
                     activity.setProgress(progress * 1000);
                   }
                 });
                 webview.setWebViewClient(new WebViewClient() {
                   public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
                   }
                 });
        
                 webview.loadUrl(url);
        
        
        
            }
        
        
        }
        

        【讨论】:

        • 谢谢我试过了,但还是有问题,因为我得到了这个错误:03-27 10:50:30.240: E/AndroidRuntime(6073): java.lang.RuntimeException: Unable to instance activity ComponentInfo {com.sapientnitro.lcinstore2/com.sapientnitro.lcinstore2.CustomWebView}:java.lang.InstantiationException:com.sapientnitro.lcinstore2.CustomWebView
        • 似乎最终的问题是:getWindow().requestFeature(Window.FEATURE_PROGRESS);在内容之前被调用?我刚刚评论了它,它现在可以工作了..
        猜你喜欢
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2023-04-04
        相关资源
        最近更新 更多