MainActivity将有效的字符串置于额外的意图中,但意图找到了null字符串.该怎么办



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

我将文件名" help"放入Intent的附加功能中,然后立即开始。(第一个代码块没有任何问题。在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"Intent的附加功能中获取。但这是null

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

我猜想如果我提供了一个可编译的程序,该程序显示了错误,那就更容易了。但是...

如果没有人立即发现任何东西,我会继续前进。

但这很简单!

但不是。

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

编辑

我添加了2个Log语句(请参见上文),并获得了此输出:

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

不确定这是如何有帮助的,因为它看起来像"帮助"。我认为密钥是null等同于文件名为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("nrt ,.:;-( )"); // 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 );
  }
}

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

在遵循板球的建议时,我注意到import区域中的一条线:

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

我不记得以前见过。因此,无论使用PACKAGE_NAME的任何地方,我都将其取出并遇到了一些错误。由于每行都有"红色下划线",指示使用按键'Alt-Enter'用于简单的import构造,因此我发现我有两个选择:上面和MainActivity.PACKAGE_NAME

我假设我以前这样做的时候,我选择了错误的物品将其用于import

一切都很好。

花费了太久。

感谢所有帮助和板球指导我朝正确方向指导的人。

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

最终编辑:

我一直需要做的只是删除长import语句。还要注意我选择的事情。

犯罪。

我以为我一直在做板球一直在做的事情。在其他课程中没有得到有趣的进口。为什么在这里????

看起来"帮助"是应该的。

它做

...键为null

实际上是值,但是您将获得键"filename"的值,而不是PACKAGE_NAME + ".filename",它是您在Putextra中使用的。

键不匹配,因此值为null

建议:定义自己的常数

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

并在所有类中使用它

另外,您的扫描仪以及需要打开文件的所有内容都应在尝试块内。

您将数据放入Intent,而不是Bundle

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

检索值时,您使用的是错误的键。

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

最新更新