【问题标题】:Launch url from one activity on another activity从一项活动启动另一项活动的网址
【发布时间】:2015-04-20 05:06:32
【问题描述】:

我一直在尝试制作一个小型 WebView 应用程序,让用户可以在其中搜索和加载网站。

目前我的代码在结构和使用的参考方面看起来很有希望,但我偶然发现了一个似乎无法修复的错误。我一直在寻找有关如何将 MainActivity 类 EditText 中的数据作为字符串解析到 WebActivity 类上的 WebView 的解决方案。

到目前为止,我没有运气,我已经尝试了几个网站并对此进行了更多研究,但我不知道发生了什么。我什至在 StackOverFlow 上查找了关于我的情况的类似答案,但对我没有任何帮助。

这是我得到的错误:

04-20 16:56:55.563: D/AndroidRuntime(32040): Shutting down VM
04-20 16:56:55.564: E/AndroidRuntime(32040): FATAL EXCEPTION: main
04-20 16:56:55.564: E/AndroidRuntime(32040): Process: com.thearclabs.carpo, PID: 32040
04-20 16:56:55.564: E/AndroidRuntime(32040): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.thearclabs.carpo/com.thearclabs.carpo.WebActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.ActivityThread.access$800(ActivityThread.java:151)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.os.Handler.dispatchMessage(Handler.java:102)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.os.Looper.loop(Looper.java:135)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.ActivityThread.main(ActivityThread.java:5254)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at java.lang.reflect.Method.invoke(Native Method)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at java.lang.reflect.Method.invoke(Method.java:372)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
04-20 16:56:55.564: E/AndroidRuntime(32040): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
04-20 16:56:55.564: E/AndroidRuntime(32040):    at com.thearclabs.carpo.WebActivity.<init>(WebActivity.java:9)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at java.lang.reflect.Constructor.newInstance(Native Method)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at java.lang.Class.newInstance(Class.java:1606)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
04-20 16:56:55.564: E/AndroidRuntime(32040):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
04-20 16:56:55.564: E/AndroidRuntime(32040):    ... 10 more

这是我的 MainActivity 的 onCreate 方法中的代码:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText searchInput = (EditText) findViewById(R.id.searchInput);
final String webUrl = searchInput.getText().toString();

searchInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            Intent intent = new Intent(MainActivity.this, WebActivity.class);
            intent.putExtra("website", webUrl);
            startActivity(intent);
            return true;
        }
        return false;
    }
});

这是我的 WebActivity 代码:

public class WebActivity extends Activity {

    String webUrl = getIntent().getExtras().getString("webUrl"); // error is coming from here, according the the error log.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        WebView webView = (WebView) findViewById(R.id.webView);
        webView.loadUrl("http://example.com" + webUrl);

        // webView.getSettings().setJavaScriptEnabled(true);

    }
}

【问题讨论】:

    标签: java android string webview nullpointerexception


    【解决方案1】:

    请你在那里更新 webActivity。

    public class WebActivity extends Activity {
           String webUrl="";
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_web);
                Bundle bundle=getIntent().getExtras();
    
                if(bundle!=null){
                   webUrl = bundle.getString("webUrl"); 
                }
    
                WebView webView = (WebView) findViewById(R.id.webView);
                if(!TextUtils.isEmpty(webUrl)){
                     webView.loadUrl("http://example.com" + webUrl);
                }
                // webView.getSettings().setJavaScriptEnabled(true);
    
            }
        }
    

    【讨论】:

      【解决方案2】:

      onCreate 等任何方法中调用getIntent(),而不是在类级别:

          String webUrl = "";
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_web);
               webUrl = getIntent().getExtras().getString("website");
              //..your code here...
         }
      

      还进行以下更改:

      1.在访问getExtras()方法前添加null检查。

      2. 在 Intent 中添加数据时,使用之前 Activity 中使用的相同键。目前您正在使用webUrl 获取价值,但在之前的活动中使用website

      【讨论】:

      • 这里提供的大部分代码和帮助修复了错误,但是 EditText 中的文本返回 null。
      • @Pavillion:将webUrl = searchInput.getText().toString(); 行移到intent.putExtra("website", webUrl); 行之前
      • 感谢它现在可以工作,但现在它似乎在谷歌浏览器上加载网站,而不是在我的应用程序的 webView 上加载它。
      • @Pavillion:还覆盖shouldOverrideUrlLoading 方法以及为什么要在 cmets 中附加其他问题?只需接受任何答案即可完成此问题,并针对其他问题提出另一个问题
      • 对不起,我是新来的。我将更多地研究 OverrideUrlLoading 方法。非常感谢您的帮助!
      【解决方案3】:

      您必须使用密钥从意图中获取数据。试试下面的代码

      public class WebActivity extends Activity {
      
      
      
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_web);
        String webUrl = getIntent().getExtras().getString("website"); // error is coming from here, according the the error log.
                  WebView webView = (WebView) findViewById(R.id.webView);
                  webView.loadUrl("http://example.com" + webUrl);
      
                  // webView.getSettings().setJavaScriptEnabled(true);
      
              }
          }
      

      【讨论】:

      • EditText 返回 null。
      • 不,代码有效,但在 EditText 字段中输入的任何内容都不会传递给下一个活动,在 url 栏中它只是说 null
      • 尝试从edittext String s= editext,gettext().tostring() 中获取String,并使用intent.putExtra("website", s); 将s传递给activity;
      【解决方案4】:

      由于getIntent()方法在activity生命周期方法中可用,所以再使用

      String webUrl = getIntent().getExtras().getString("website"); // 根据错误日志,错误来自这里。

      onCreate方法中作为

      String webUrl = "";
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_web);
      
             webUrl = getIntent().getExtras().getString("website");
              WebView webView = (WebView) findViewById(R.id.webView);
              webView.loadUrl("http://example.com" + webUrl);
      
              // webView.getSettings().setJavaScriptEnabled(true);
      
          }
      

      【讨论】:

      • 键是website 而不是webUrl
      【解决方案5】:

      移动这条线

      String webUrl = getIntent().getExtras().getString("webUrl");
      

      onCreate() 方法之后。

      编辑:

      移动这一行

      final String webUrl = searchInput.getText().toString(); 
      

      在这种情况下

      searchInput.setOnEditorActionListener(new TextView.OnEditorActionListener(){
      @Override
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
          if (actionId == EditorInfo.IME_ACTION_SEARCH) { 
              String webUrl = searchInput.getText().toString(); 
              Intent intent = new Intent(MainActivity.this, WebActivity.class);
              intent.putExtra("website", webUrl);
              startActivity(intent);
              return true;
          }
          return false;
      }
      });
      

      【讨论】:

      • 谢谢,它现在可以正常工作,但没有返回任何错误(变为 null),所以基本上在 EditText 中键入的任何内容都返回为 null。
      • 它可以工作,但网页加载到 chrome 上,而不是加载到我的应用程序 webveiw 上。感谢您的快速回复。
      猜你喜欢
      • 2014-09-19
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多