#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. Еще раз спасибо.