MainActivity помещает действительную строку в дополнительные элементы для намерения, но намерение находит пустую строку. Что делать?
Я сбит с толку тем, что происходит.
Я положил имя файла "Справка" в Extras of the 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
Не уверен, как это помогает, так как похоже, что "Помощь" находится там, где и должна быть. И я предполагаю, что ключ равен нулю, что эквивалентно исходной проблеме о том, что имя файла равно нулю.
============================
РЕДАКТИРОВАТЬ № 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("\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 );
}
}
=========================
Следуя совету по крикету, я заметил длинную линию в import
площадь:
import static android.provider.ContactsContract.Directory.PACKAGE_NAME;
Я не помню, чтобы когда-либо видел такое раньше. Поэтому я вынул его и получил несколько ошибок, где бы PACKAGE_NAME
использовался. Поскольку каждая строка имеет "красное подчеркивание", указывающее, используйте клавишу "Alt-Enter" для легкого import
строительство, я обнаружил, что у меня было два выбора: выше и MainActivity.PACKAGE_NAME
,
Я предполагаю, что в прошлый раз, когда я сделал это, я выбрал не тот пункт, чтобы import
,
Все хорошо.
Потратил... слишком долго на это.
Спасибо всем, кто помог, и Крикет, который направил меня в правильном направлении.
=====================
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Все, что мне нужно было сделать, это удалить длинную import
заявление. А также обратите внимание на то, что я выбрал после этого.
Criminey.
Я думал, что делал то, что предлагал Крикет все время. Не получил смешной импорт в других классах. Почему здесь????
3 ответа
Похоже, "Помощь" там, где и должна быть.
Оно делает
... ключ нулевой
На самом деле это значение, но вы получаете значение ключа "filename"
не PACKAGE_NAME + ".filename"
, который вы использовали в putExtra.
Ключи не совпадают, поэтому значение равно нулю
Предложение: определите свою собственную константу как
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") );