Bundle extras returning null - android

I'm having some problems.
In a class "A" I have the code:
Bundle extras = getIntent().getExtras();
if ( extras == null ){
Log.e("extras", "Extra NULL");
}
String arrayWatt = extras.getString("valoresWatt");
String arrayHorario = extras.getString("valoresHorario");
Bundle extras = getIntent().getExtras(); --> this is returning NULL`
This method throws NUllPointerException. What is the problem here? Syntax?
---EDIT----
So sorry, I forgot this code:
(This code is from another class that starts the activity)
Intent i = new Intent();
i.setClassName("org.me.android",
"org.me.android.GraphViewDemo");
i.putExtra("valoresWatt", watt);
i.putExtra("valoresHorario", hora);
startActivity(i);

If you want to get the extras, this is what I would do:
Intent i = getIntent();
String arrayWatt = i.getStringExtra("valoresWatt");
String arrayHorario = i.getStringExtra("valoresHorario");

Where is the code you listed for getting the Extras located? Are you overriding the onCreate method? If so, make sure you call super.onCreate(bundleVariableName) before trying to work with the Extras. So...
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myLayout);
// ...
Bundle data = getIntent().getExtras();
if (data != null ) {
// should actually verify that the key exists, so:
// if (data.containsKey("valoresWatt")) {
// ... do something with the value
String watt = data.getString("valoresWatt");
String horario = data.getString("valoresHorario");
}
// ...
}

In your original code, you say that this first line is returning null:
Bundle extras = getIntent().getExtras(); // --> this is returning NULL
From the Android docs for Intent, it seems that the getExtras() method will return null if no extras have been added yet.
In that case, you may have to add your String extras by calling .putExtra(key, value) on the Intent object directly, rather than on its Map of extras, which doesn't exist yet.

For the NPE crash
Bundle extras = getIntent().getExtras();
if ( extras == null ){
Log.e("extras", "Extra NULL");
} else {
String arrayWatt = extras.getString("valoresWatt");
String arrayHorario = extras.getString("valoresHorario");
}
Instead of
i.putExtra("valoresWatt", watt);
i.putExtra("valoresHorario", hora);
try
i.putStringArrayListExtra("valoresWatt", watt);
i.putStringArrayListExtra("valoresHorario", hora);
if it is an arraylist of strings.

Related

Crashes in Android 6.0.1 after restart because of Bundle extras = getIntent().getExtras()

I am trying retrieve variables with this code
Here's my MainActivity
public class MainActivity extends AppCompatActivity {
String Variable1 = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle extras = getIntent().getExtras();
if (extras != null) {
Variable1 = extras.getString("Variable1");
EditText1_ET.setText(Variable1);
}
}
}
I am creating Variable1 in another Activity
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.putExtra("Variable1", textview.getText().toString());
startActivity(i);
Its working great until I reboot OS (Android 6.0.1) and start my app, I get error that my app stopped working.
I tried it on Android 5.1 and its working without error.
Can anyone help me please?
You should do this, and check for nullability :
if (extras != null) {
String variable1 = extras.getString("Variable1");
if (variable1 != null) {
EditText EditText1_ET = (EditText) findViewById(R.id.xxxx);
if (EditText1_ET != null)
EditText1_ET.setText(variable1);
}
}
Also init your EdiText variable before setting text !
Well it is better to change the following:
SearchQueryTerm = extras.getString("Variable1");
EditText1_ET.setText(Variable1);
to:
Variable1 = extras.getString("Variable1");
if(EditText1_ET != null) {EditText1_ET.setText(Variable1);}
in your code you just assign null to your EditText every time.
Looks like you've solved your problem. Yet, I though I need to put my suggestion here.
From the Activity2 where you're passing the parameter value, do you really need to get the text from a TextView? Because, you already have set some String value in your TextView somewhere. Just use that String variable to pass the value to another Activity.
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.putExtra("Variable1", myString);
startActivity(i);
Now in the MainActivity, check if the Variable1 is null and initialize your EditText first.
public class MainActivity extends AppCompatActivity {
String Variable1 = null;
private EditText EditText1_ET; // Declare an EditText first
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize your EditText here
EditText1_ET = (EditText) findViewById(R.id.your_edit_text_id);
Bundle extras = getIntent().getExtras();
if (extras != null) {
Variable1 = extras.getString("Variable1");
// Here check if Variable1 is null
if(Variable1 != null) EditText1_ET.setText(Variable1);
}
}
}
Had the same problem, it was still crashing even after checking for null.
I used a try-catch block and that solved the problem for me.

How to pass value using Intent between Activity in Android?

I want to pass the value of the position in one activity class to another...
My code is as follows:
protected void onListItemClick(ListView listView, View v, int position,
long id) {
switch (position) {
case 1:
Intent newActivity1 = new Intent(this, BucketItemActivity.class);
newActivity1.putExtra("bucketno", position);
startActivity(newActivity1);
break;
case 2:
Intent newActivity2 = new Intent(this, BucketItemActivity.class);
newActivity2.putExtra("bucketno", position);
startActivity(newActivity2);
break;
}
}
The activity class that will receive it..
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bucket_item);
String value = getIntent().getExtras().getString("bucketno");
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(value);
setContentView(textView);
}
But i always get a null in the String value...
Please help.
Replace this,
String value = getIntent().getExtras().getString("bucketno");
with
int value = getIntent().getExtras().getInt("bucketno");
You are trying to pass int value but retrieving String Data. That's why you are getting the nullpointerException.
You can use :
In first activity ( MainActivity page )
Intent i = new Intent(MainActivity.this,SecondActivity.class);
i.putExtra("YourValueKey", yourData.getText().toString());
then you can get it from your second activity by :
In second activity ( SecondActivity page )
Intent intent = getIntent();
String YourtransferredData = intent.getExtras().getString("YourValueKey");
String value = Integer.toString(getIntent().getExtras().getInt("bucketno"));
Bundle extras = getIntent().getExtras();
if (extras != null) {
String data = intent.getExtras().getString("key").toString();
}
From the First Activity
Intent i=new Intent(getApplicationContext(),BookPractionerAppoinment.class);
i.putExtra("prac","test");
startActivity(i);
Getting values in Second ACT Activity
String prac=getIntent().getStringExtra("prac);
For Serialized objects:
Passing
Intent i=new Intent(getApplicationContext(),BookPractionerAppoinment.class);
i.putExtra("prac",pract);
startActivity(i);
Getting
pract= (Payload) getIntent().getSerializableExtra("prac");
Use:
String value = getIntent().getExtras().get("key").toString();
getIntent().getExtras() will give you Boundle. get() method can be used to fetch the values.
In addition who has different sittuation
double userDMH = Util.getInstance(TakeInfoOne.this).calculateBMH(userGender, kg, talll, currentAge, activityy);
Intent intentTogeneral = new Intent(TakeInfoOne.this, TakeInfoTwo.class);
intentTogeneral.putExtra("user_current_age",userDMH );
startActivity(intentTogeneral);
If you put other primitives like double , boolean , int just dont forget to type correct format while geting the value in secont Activity
Bundle extras = getIntent().getExtras();
if (extras != null) {
double value = extras.getDouble("user_current_age");
txt_metabolism.setText(""+value);
}
Here with extras.getDouble() type your concerned value type like
extras.getInt("user_current_age");
extras.getBoolean("user_current_age");
extras.getString("user_current_age");

How to check existence Extras in Intent

When I try to get Extras, I get Fatal Eroorr
try{
Sdacha=getIntent().getExtras().getString("Sdacha");
}
catch(NullPointerException e){}
How can I check existence Extras?
Try this,
if(getIntent().getExtras().containsKey("Sdacha"))
{
String preview=getIntent().getExtras().getString("Sdacha");
}
EDIT
Also as Evos suggested, one more layer of Null check can also be added to the above code.If you are sure that the extras will not be null, then the above approach is good. If not follow the below one.
if(getIntent().getExtras()!=null)
{
if(getIntent().getExtras().containsKey("Sdacha"))
{
String preview=getIntent().getExtras().getString("Sdacha");
}
}
It's easy just check that Extras is not null before getting something from it:
if (getIntent().getExtras() != null){
Sdacha=getIntent().getExtras().getString("Sdacha");
}
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
String preview = bundle.getString("Sdacha");
if (preview != null) {
// do anything .....
}
}
To prevent this from happening, I like to encapsulate my calls into a static startActivity method, the same pattern as the newInstance() in fragments:
public static void startActivity(Activity activity, int param, int flags){
Intent intent = new Intent(activity, MainActivity.class);
intent.setFlags(flags);
intent.putExtra(PARAM, param);
activity.startActivity(intent);
}
And of course if you use this method from other activities, you'll never have a NPE.

Why does the Intent that starts my activity not contain the extras data I put in the Intent I sent to startActivity()?

I explained this badly originally. This is my question: The Intent I send to the startActivity() method, contains a private field, mMap, which is a Map containing the strings I sent to putExtra(). When the target activity starts, a call to getIntent() returns an Intent that does not contain those values. The mMap field is null. Obviously, something in the bowels of the View hierarchy or the part of the OS that started the new activity created a new Intent to pass to it, since the object IDs are different.
But why? And why are the putData() values not carried fowrard to the new Intent?
The activity that starts the new activity extends Activity. Here's the startup code:
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case 4:
i = new Intent(this, StatList.class);
i.putExtra("Name1", "Test1");
i.putExtra("Name3", "Test2");
startActivity(i);
}
}
I've tried the key values with and without the (recommended) complete package name prefix.
In the Eclipse debugger, I have verified the values for the player names are being inserted into i.mExtras.mMap properly.
Here's the code from the startee:
public class StatList extends ListActivity {
private final StatsListAdapter statsAdapter;
public StatList() {
statsAdapter = StatsListAdapter.getInstance(this);
} // default ctor
#Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Intent i = getIntent();
final Bundle extras = i.getExtras();
< more code here >
}
When execution gets to this method, mIntent.mExtras.mMap is null, and mIntent.mExtras.mParcelledData now contains some values that don't look sensible (it was null when startActivity() was called). getIntent() returns mIntent.
I've also tried startActivityForResult(), with the same result.
From the docs and the samples I've seen online & in the sample apps, this should be easy. I've found another way to meet my immediate need, but I'd like to know if anyone can help me understand why something this simple doesn't work.
In your main Activity:
i = new Intent(this, StatList.class);
i.putExtra("Name1", "Test1");
i.putExtra("Name3", "Test2");
startActivity(i);
Then in StatList.class
Bundle extras = getIntent().getExtras();
String name1 = extras.getString("Name1");
String name3 = extras.getString("Name3");
Log.i("StatList", "Name1 = " + name1 + " && Name3 = " + name3)
Update the following two line
final Intent i = getIntent();
final Bundle extras = i.getExtras();
Replace it with
Bundle extras = getIntent().getExtras();
if(extras!= null){
String var1= extras.getString("Name1");
String var2= extras.getString("Name2");
}

getIntent.getExtras() does not return null but has no values.

Question is simple, I am not exactly new to Android but I cannot, for the life of me, retrieve the extras passed via an intent from Activity A to Activity B.
See Activity A: This is actually a ListFragment, that implements onListItemClick() to start another activity via an intent.
#Override
public void onListItemClick(ListView l, View v, int position, long id) {
Log.i("FragmentList", "Item clicked: " + id);
Intent i = new Intent(getActivity(), ExpandedTweetView.class);
twitter4j.Status status = adapter.getItem(position);
Bundle extras = new Bundle();
extras.putString(KEY_TEXT, status.getText());
extras.putString(KEY_HANDLE, status.getUser().getScreenName());
extras.putString(KEY_NAME, status.getUser().getName());
extras.putString(KEY_TIMESTAMPS, status.getCreatedAt().toString());
extras.putLong(KEY_RETWEETS, status.getRetweetCount());
i.putExtra(KEY_EXTRAS, extras);
startActivity(i);
}
This part just works, I tested it usng Log.v(TAG, "status.getText()" to make sure that the error was not coming from the Adapter passing an empty item via getItem().
Here is the code on Activity B:
public class ExpandedTweetView extends Activity {
TextView text;
TextView name;
TextView handle;
TextView createdAt;
TextView retweets;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expanded_list_item);
Bundle extras = getIntent().getExtras();
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
text = (TextView) findViewById(R.id.h_content);
name = (TextView) findViewById(R.id.h_name);
handle = (TextView) findViewById(R.id.h_handle);
createdAt = (TextView) findViewById(R.id.h_timestamp);
retweets = (TextView) findViewById(R.id.h_retweet_count);
if(extras != null) {
text.setText(extras.getString(TimelineFragment.KEY_TEXT));
name.setText(extras.getString(TimelineFragment.KEY_NAME));
handle.setText(extras.getString(TimelineFragment.KEY_HANDLE));
createdAt.setText(extras.getString(TimelineFragment.KEY_TIMESTAMPS));
retweets.setText(String.valueOf(extras.getLong(TimelineFragment.KEY_RETWEETS)));
}
}
As you can see, I believe I am using the right code to obtain the extras, using the same code on other applications worked. Not sure why, when the ExpandedTweetView is created via an intent, ALL of the textViews are empty. See: https://www.dropbox.com/s/pso6jbyn6rpks9n/empty_activity.png
What is even MORE strange is that I had initially tried checking to see if the bundle was null by calling this:
if (extras == null) {
Log.v(TAG, "Extras are empty :(");
}
But that line was never executed, meaning the bundle is not null. I also thought that maybe the keys being used to retrieve the individual Strings from the bundle were mismatching; however, in order to remedy that I decided to create constants that could be used on both sides. As you can see on the code, both the key to set the Extra and the Key to retrieve the Extra are the same.
Any ideas as to what the heck is going on?
Bundle extras = getIntent().getExtras();
if (extras != null) {
extras = extras.getBundle("KEY_EXTRAS");
String status = extras.getString("KEY_TEXT");
}
Try adding the extra variable to intent rather than in Bundle
Ex:
i.putExtra(KEY_1, a);
i.putExtra(KEY_2, b);
i.putExtra(KEY_3, c);
Then retrieve it from other activity from intent
Ex:
getIntent().getStringExtra(KEY_1) ;
In Activity A:
Intent i = new Intent(MainActivity.this, AnotherActivity.class);
Bundle b = new Bundle();
b.putString("thisc", "my name");
i.putExtra("bundle", b);
startActivity(i);
In Activity B:
**Bundle bun = getIntent().getBundleExtra("bundle");
if (bun.containsKey("thisc")) {
Log.i("TAG", bun.getString("thisc"));
} else {
Log.i("TAG", "no thisc");
}**
Check the first line of code in Activity B, that's the main difference actually!!
//put value
Intent inatent = new Intent(this,text.class);
inatent_logo.putExtra("message","hello");
startActivity(inatent);
//get vale
String msg = getIntent().getStringExtra("message").toString();
It's Difficult to maintain intent to Bundle and Bundle to Intent if number of data you want ti share from one Activity to Other Activity.
just Simply use Intent with PuExtra() with different argument.
you can pass number of data in intent like :
Sender's Side :
Create your Intent.
Intent My_Intent = new Intent(FromClass.this,ToClass.class);
Add your value which you want to share with other activity.
My_Intent.putExtra("VAR_A",a_value);
My_Intent.putExtra("VAR_B",b_value);
My_Intent.putExtra("VAR_C",c_value);
Call your Intent.
StartActivity(My_Intent);
Receiver's Side :
Intent My_Intent = getIntent();
First_Value=My_Intent.getStringExtra("VAR_A");
Sec_Value=My_Intent.getStringExtra("VAR_B");
Thred_Value=My_Intent.getStringExtra("VAR_C");
I Think its Easy for you to Handel your data from one Activity to other .

Categories

Resources