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 );
}
}
=========================
在接下来的板球建议中,我注意到import
area中的一条长线:
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。该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章