MainActivity将有效的String放入Intent的Extras中,但Intent找到null String。该怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MainActivity将有效的String放入Intent的Extras中,但Intent找到null String。该怎么办?相关的知识,希望对你有一定的参考价值。

我对发生的事情感到困惑。

我将文件名“Help”放入Intent的Extras中,然后立即启动。 (第一个代码块没有任何问题。在putExtra之后使用断点,监视表达式helpIntent.getStringExtra(PACKAGE_NAME + ".filename")返回"Help"。)

import static com.dslomer64.sqhell.BuildConfig.APPLICATION_ID;
...
public class MainActivity extends Activity
{
  public final static String PACKAGE_NAME       = APPLICATION_ID;
...
  @Override public boolean onOptionsItemSelected(MenuItem item)
  {
    if(item.toString().equals("Help") || item.toString().equals("Acknowledgements"))
    {
      Intent
          helpIntent;
      helpIntent = new Intent(this, HelpActivity.class);

      helpIntent.putExtra(PACKAGE_NAME + ".filename", item.getTitle().toString());

      startActivity(helpIntent);
      return true;
    }
...
}

有趣的是从产生的Intent开始:

public class HelpActivity extends Activity
{
...
  public void showHelp(AssetManager assets, String filename)
  {
    try
    {
    ////////////////////////////////////////////
    //                      filename = null ********* #1
       stream = assets.open(filename); 
    ////////////////////////////////////////////    }

    catch (IOException e) { e.printStackTrace(); }
...
  }

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

    Log.w("`````Help", "onCreate--bundle info: " + bundle.toString()) ;
    Log.w("`````Help","onCreate--bundle key: " + bundle.getString("filename") );

     Bundle bundle = getIntent().getExtras();

    setContentView(R.layout.activity_help);

    ////////////////////////////////////////////
    String fn = bundle.getString((PACKAGE_NAME + ".filename"));
    //     fn = null  ***************************** #2
    ////////////////////////////////////////////
    showHelp(getAssets(), fn ); 
  } 

麻烦的第一个迹象(#1)是“文件名为空”。追溯很容易。现在我们在#2,在那里 - 只是比较 - 我使用相同的基本语法来尝试从"Help"的Extras中获取文件名Intent。但它是null

我不是Intent的专家,但我过去曾成功使用过几次。

我想如果我提供了一个可编辑的程序来显示错误会更容易。但......

如果没有人发现任何事情,我会继续这样做。

但它很简单!

但不是。

================

编辑

我添加了2个Log语句(见上文)并得到了这个输出:

    W/`````Help: onCreate--bundle info: 

Bundle[{com.dslomer64.sqhell.filename=Help}]
//////////////////////////////////////^^^^
    W/`````Help: onCreate--bundle key: null

不知道这有什么帮助,因为看起来“帮助”应该是它的位置。我假设key为null相当于filename的原始问题为null。

============================

编辑#2:这是整个HelpActivity类。如果这没有帮助,我会得到可编译的东西:

package com.dslomer64.sqhell;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;
import android.widget.EditText;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import static android.provider.ContactsContract.Directory.PACKAGE_NAME;

public class HelpActivity extends Activity
{
  Scanner     scDict;
  InputStream stream;
  EditText    help;

  public void showHelp(AssetManager assets, String filename)
  {
    help = /*(EditText)*/ findViewById(R.id.txaHelp);
    try
    {
      stream = assets.open(filename);
    }
    catch (IOException e) { e.printStackTrace(); }

    scDict = new Scanner(stream).useDelimiter("

	 ,.:;-( )"); // added (SPACE) recently

    help.getText().clear();
    while(scDict.hasNext())
      help.append(scDict.next());

    hideKeyboard();

    help.setSelection(0);
  }

  @Override
  public void onCreate(Bundle savedInstanceState)
  {

    super.onCreate(savedInstanceState);

    Bundle bundle = getIntent().getExtras();

    setContentView(R.layout.activity_help);

    Log.w("`````Help", "onCreate--bundle info: "  + bundle.toString()) ;
    Log.w("`````Help", "onCreate--bundle key: "   + bundle.getString(PACKAGE_NAME + ".filename"));
    String fn =                                     bundle.getString(PACKAGE_NAME + ".filename");
    showHelp(getAssets(), fn );

  }

}

=========================

在接下来的板球建议中,我注意到importarea中的一条长线:

    import static android.provider.ContactsContract.Directory.PACKAGE_NAME;

我不记得曾经见过这样的人。所以我把它拿出来并且在使用PACKAGE_NAME的地方出现了一些错误。由于每条线都有“红色下划线”表示使用按键'Alt-Enter'为简单的import构造,我发现我有两个选择:上面的那个和MainActivity.PACKAGE_NAME

我假设我之前做过这个,我选择了错误的项目给import

一切都很好。

花了太长时间了。

感谢所有帮助过的人和Cricket带领我朝着正确的方向前进。

=====================

最终编辑:

所有我需要做的就是删除长import声明。并且还要注意我做完后选择的内容。

Criminey。

我以为我一直在做Cricket建议的事情。没有在其他课程中获得有趣的导入。为什么在这里????

答案

看起来“帮助”应该是它的位置。

确实如此

...键为空

它实际上是值,但你得到的关键"filename",而不是PACKAGE_NAME + ".filename"的值,这是你在putExtra中使用的。

键不匹配,因此值为null

建议:定义你自己的常量

public static final String FILENAME_EXTRA = APPLICATION_ID + ".filename";

并在所有类中使用它

此外,您的扫描仪和需要打开文件的所有内容都应位于try块内。

另一答案

你把数据放在Intent,而不是Bundle

所以,试试String fn = getIntent().getStringExtra(PACKAGE_NAME + ".filename")。然后你就会找到你想要的东西。

另一答案

检索值时使用了错误的密钥。

  Log.w("`````Help","onCreate--bundle key: " + bundle.getString(PACKAGE_NAME + ".filename") );

以上是关于MainActivity将有效的String放入Intent的Extras中,但Intent找到null String。该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

想要使用循环将数组列表项放入变量中

最长有效括号

C# SQL语句查询出来的字段放入数组中

字符串放入数组,Java的。

c语言如何将多个字符串放入数组

如何调用public void(int i,string s)