Отправка пакета / данных в другой класс или экран

#java #android #views

#java #Android #Вид

Вопрос:

Что я делаю не так?

Я просмотрел другие вопросы и подумал, что делаю то же самое, но поскольку у меня это не работает, очевидно, я делаю что-то не так!

У меня есть мой MainActivity.class , который получает данные JSON (координаты) из URL. Эта часть работает. Затем я хочу загрузить MapView, называемый OverlayActivity.class , и отправить эти данные на эту карту, чтобы я мог заполнить ее наложениями и т.д. Я перемещаю различное количество точек вниз и динамически создаю кнопки. В зависимости от того, какая кнопка нажата, она отправляет разные данные. Вот код для этого цикла:

 final LinearLayout layout = (LinearLayout) findViewById(R.id.menuLayout);
layout.removeAllViewsInLayout();
String itemName="";
int itemID=0;
for (int i = 0; i < dataSetsMap.size(); i  ) {
    itemID=i 1;
    itemName=dataSetsMap.get(itemID);
    Button b = new Button(this);
    b.setText(itemName);
    layout.addView(b);

    // These need to be final to use them inside OnClickListener()
    final String tempName=itemName;
    final int tempID=itemID;

        b.setOnClickListener(new View.OnClickListener() {
              public void onClick(View v) {
                Intent i = new Intent();
                Bundle b = new Bundle();

                i.setClass(myContext, OverlayActivity.class);
                Log.i(TAG, "Setting extras: 1:" tempName " and 2:" tempID);
            b.putInt(tempName, tempID);
                i.putExtras(b);
                startActivity(i);  
              }
          });
}   // End for()
  

Итак, очевидно, что я хочу прочитать эти данные с другой стороны, предполагая, что я отправляю их правильно. Итак, чтобы прочитать это, я попробовал несколько разных вещей:

         //Method 1:
    String test1=intent.getStringExtra("name");
        String test2=intent.getStringExtra("id");

    //Method 2:
        String meh=getIntent().getExtras().getString("id").toString();
        String bleh=getIntent().getExtras().getString("name");

        //Method 3:
        String value=savedInstanceState.getString("name");
        String id=savedInstanceState.getString("id").toString();

        //Method 4:
        Bundle bundle = getIntent().getExtras();
        String id=bundle.getString("id"); 
        String value = getIntent().getExtras().getString("name");
  

я получаю NullPointerException при попытке использовать любой из этих методов. Я впервые использую методы такого типа, так что может кто-нибудь указать мне правильное направление или сказать, где я ошибся?

Комментарии:

1. Вы уверены, что intent это не null и / или это getIntent() не возвращается null ? Откуда берется NPE?

2. Каждая строка во 2-м блоке кода сама по себе вызывает NPE. Я получил это, работая с ответами ниже. Спасибо.

Ответ №1:

Во-первых, использовать, Bundle b когда у вас уже есть Button b , на самом деле не очень хорошая идея, если по какой-либо другой причине это сбивает с толку, 😉

Во-вторых, вам не нужно использовать пакет для передачи строки и int. Просто добавьте их непосредственно в свой Intent…

 Intent i = new Intent(myContext, OverlayActivity.class);
i.putExtra("name", tempName);
i.putExtra("id", tempID);
startActivity(i);  
  

Чтобы извлечь их в вашем OverlayActivity, используйте…

 Intent i = getIntent();
String name = i.getStringExtra("name");
int id = i.getIntExtra("id", -1); // -1 in this case is a default value to return if id doesn't exist
  

Ответ №2:

Почему бы просто не сделать это:

 Intent i = new Intent();
                i.setClass(myContext, OverlayActivity.class);
                Log.i(TAG, "Setting extras: 1:" tempName " and 2:" tempID);
            i.putExtra("name", tempName);
            i.putExtra("id", tempID);
                startActivity(i);  
  

и затем вы можете извлекать их с помощью:

   String name = getIntent().getStringExtra("name", "");
  int id = getIntent().getIntExtra("id", 0);
  

Комментарии:

1. Спасибо, это тоже сработало, но я принял приведенное выше, потому что на него был дан ответ первым. PS, getIntent().getStringExtra("name"); это правильный формат. Дополнительное возвращаемое значение по умолчанию не работает со строкой, только с int. Еще раз спасибо.