MainActivity 将有效字符串放入 Intent 的 Extras 中,但 Intent 找到空字符串。该怎么办?
MainActivity puts valid String into Extras for an Intent but the Intent finds null String. What to do?
我对发生的事情感到困惑。
我把文件名"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) 是 "filename is empty"。追溯很容易。现在我们在 #2,在这里——只是比较——我使用相同的基本语法来尝试从 Intent
的 Extras 中获取文件名 "Help"
。但它是 null
.
我不是 Intent
的专家,但我过去曾成功使用过几次。
我想如果我提供一个显示错误的可编译程序会更容易。但是...
如果没有人马上发现任何东西,我会继续的。
但这很简单!
但不是。
================
编辑
我添加了 2 个 Log
语句(见上文)并得到了这个输出:
W/`````Help: onCreate--bundle info:
Bundle[{com.dslomer64.sqhell.filename=Help}]
//////////////////////////////////////^^^^
W/`````Help: onCreate--bundle key: null
不确定这有什么帮助,因为看起来 "Help" 是它应该在的位置。我假设 key is null 等同于文件名为 null 的原始问题。
==============================
编辑 #2:这是全部 HelpActivity
class。如果这没有帮助,我会继续编译:
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("\n\r\t ,.:;-( )"); // 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 );
}
}
=========================
在听从 cricket 的建议后,我注意到 import
区域有一条长线:
import static android.provider.ContactsContract.Directory.PACKAGE_NAME;
我不记得以前见过这样的。所以我把它拿出来,在使用 PACKAGE_NAME
的地方出现了一些错误。由于每一行都有 "red underline" 指示使用按键 'Alt-Enter' 来实现简单的 import
构造,我发现我有两个选择:上面的那个和 MainActivity.PACKAGE_NAME
.
我假设我上次这样做时,我选择了错误的项目 import
。
一切顺利。
在这上面花了...太久了。
感谢所有帮助过我的人,感谢 Cricket 指引我走向正确的方向。
=====================
最终编辑:
我一直需要做的就是删除长 import
语句。还有注意我做完之后选的是什么
犯罪。
我以为我一直在做 Cricket 建议的事情。在其他 classes 中没有得到有趣的导入。为什么在这里????
您将数据放在 Intent
,而不是 Bundle
。
所以,试试String fn = getIntent().getStringExtra(PACKAGE_NAME + ".filename")
。然后你会找到你想要的。
it looks like "Help" is where it should be.
确实如此
... key is null
它实际上是值,但您得到的是键 "filename"
的值,而不是 PACKAGE_NAME + ".filename"
,这是您在 putExtra 中使用的值。
键不匹配,所以值为空
建议:像
一样定义你自己的常量
public static final String FILENAME_EXTRA = APPLICATION_ID + ".filename";
并在所有 类
中使用它
此外,您的扫描仪和所有需要打开文件的东西都应该在 try 块中。
您在检索值时使用了错误的密钥。
Log.w("`````Help","onCreate--bundle key: " + bundle.getString(PACKAGE_NAME + ".filename") );
我对发生的事情感到困惑。
我把文件名"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) 是 "filename is empty"。追溯很容易。现在我们在 #2,在这里——只是比较——我使用相同的基本语法来尝试从 Intent
的 Extras 中获取文件名 "Help"
。但它是 null
.
我不是 Intent
的专家,但我过去曾成功使用过几次。
我想如果我提供一个显示错误的可编译程序会更容易。但是...
如果没有人马上发现任何东西,我会继续的。
但这很简单!
但不是。
================
编辑
我添加了 2 个 Log
语句(见上文)并得到了这个输出:
W/`````Help: onCreate--bundle info:
Bundle[{com.dslomer64.sqhell.filename=Help}]
//////////////////////////////////////^^^^
W/`````Help: onCreate--bundle key: null
不确定这有什么帮助,因为看起来 "Help" 是它应该在的位置。我假设 key is null 等同于文件名为 null 的原始问题。
==============================
编辑 #2:这是全部 HelpActivity
class。如果这没有帮助,我会继续编译:
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("\n\r\t ,.:;-( )"); // 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 );
}
}
=========================
在听从 cricket 的建议后,我注意到 import
区域有一条长线:
import static android.provider.ContactsContract.Directory.PACKAGE_NAME;
我不记得以前见过这样的。所以我把它拿出来,在使用 PACKAGE_NAME
的地方出现了一些错误。由于每一行都有 "red underline" 指示使用按键 'Alt-Enter' 来实现简单的 import
构造,我发现我有两个选择:上面的那个和 MainActivity.PACKAGE_NAME
.
我假设我上次这样做时,我选择了错误的项目 import
。
一切顺利。
在这上面花了...太久了。
感谢所有帮助过我的人,感谢 Cricket 指引我走向正确的方向。
=====================
最终编辑:
我一直需要做的就是删除长 import
语句。还有注意我做完之后选的是什么
犯罪。
我以为我一直在做 Cricket 建议的事情。在其他 classes 中没有得到有趣的导入。为什么在这里????
您将数据放在 Intent
,而不是 Bundle
。
所以,试试String fn = getIntent().getStringExtra(PACKAGE_NAME + ".filename")
。然后你会找到你想要的。
it looks like "Help" is where it should be.
确实如此
... key is null
它实际上是值,但您得到的是键 "filename"
的值,而不是 PACKAGE_NAME + ".filename"
,这是您在 putExtra 中使用的值。
键不匹配,所以值为空
建议:像
一样定义你自己的常量public static final String FILENAME_EXTRA = APPLICATION_ID + ".filename";
并在所有 类
中使用它此外,您的扫描仪和所有需要打开文件的东西都应该在 try 块中。
您在检索值时使用了错误的密钥。
Log.w("`````Help","onCreate--bundle key: " + bundle.getString(PACKAGE_NAME + ".filename") );