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") );
Другие вопросы по тегам