I'm new to Android and I trying to do a simple app.
In the "home", I write my name and press the "send" button.
In the second page, the app show "Hello " + inserted name.
The problem is:
When I touch the back virtual button in nav bar, I come back to the home and in the input field there is always the name; but when I go back with the back button in header bar, the input field is empty.
I've tried with:
in onOptionsItemSelected:
switch (item.getItemId()){
case android.R.id.home:
Log.d("case","go back");
NavUtils.navigateUpFromSameTask(this); //or with finish();
return true;
}
it prints "case: go back" in console, but doesnt' work correcly.
My custom theme have as parent Theme.AppCompat.Light.DarkActionBar and if i put getSupportActionBar().setDisplayHomeAsUpEnabled(true); in onCreate, Android Studio tells me "Method invocation 'getSupportActionBar().setDisplayHomeAsUpEnabled(true)' may produce 'java.lang.NullPointerException'".
I solved adding this in the second Activity:
#Override
public Intent getSupportParentActivityIntent() {
return null;
}
and edit the switch/case function like this:
switch (item.getItemId()){
case android.R.id.home:
this.finish();
return false;
default:
return super.onOptionsItemSelected(item);
}
Related
My bottom navigation bar looks visually okay it contains 4 icons each moving you to a different activity and the default one is the "home" activity.
I made my navigation bar with a menu btw.
Whenever you click on an icon in order to move to another activity it moves you into that activity but the bottom navigation bar (who is supposed to highlight the screen you are in) doesn't update unless you press on the same icon again, whenever you click to move another activity it highlights the "home" activity first, only if you click the same icon does it update.
This is my code.
public boolean onNavigationItemSelected(#NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.post:
Toast.makeText(CreateNewPost.this, "Post", Toast.LENGTH_SHORT).show();
break;
case R.id.myProfile:
Toast.makeText(CreateNewPost.this, "My Profile", Toast.LENGTH_SHORT).show();
Intent profileIntent = new Intent(CreateNewPost.this, UserProfile.class);
startActivity(profileIntent);
break;
case R.id.explore:
Toast.makeText(CreateNewPost.this, "Explore", Toast.LENGTH_SHORT).show();
Intent newPostIntent = new Intent(CreateNewPost.this, Explore.class);
startActivity(newPostIntent);
break;
case R.id.home:
Toast.makeText(CreateNewPost.this, "Home", Toast.LENGTH_SHORT).show();
Intent homeIntent = new Intent(CreateNewPost.this, HomeScreen.class);
startActivity(homeIntent);
break;
default:
}
return true;
}
And this is how it looks
I want the navigation bar to highlight the correct activity (the one you are on)
How can I prevent the ActionBar back button (we gonna say ABBB) of my SecondActivity to recreate the MainActivitywhen clicked ?
I have a ListView in the MainActivity and it can be edited using the SecondActivity. The problem is that when the user presses the ABBB, the ListView is reset to default...
However, when the user clicks my OK button or presses physical back button, there is not any problem because I'm using finish();
#Override
public void onBackPressed() {
finish();
}
If I use this code... :
switch (item.getItemId()) {
case (android.R.id.home):
finish();
}
...there is the same problem because, I guess, this method is called after "Android's code".
How can I totally override Android ABBB's clicked code to set it to just call finish(); ?
The ideal scenario is, when are you in the SecondActivity (I take it that, this means that you are in Edit mode), and you press the device back button or ABBB, you show a subtle alert to the user saying "do they really want to dismiss the editing", or go ahead and apply the edit done as in the Contacts application.
So that being said, if all you require is to finish() the activity on press of ABBB, the code that you shown above should work fine (though you need to put return true; after finish()). It works for me. Try the below one in your activity.
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed(); // or finish();
return true;
}
return super.onOptionsItemSelected(item);
}
I put onBackPressed(); because your ABBB with now imitate your device back button.
Or, you can set your parent activity's launch mode as -
android:launchMode="singleTop"
that will do all without changing anything.
Reference
I am making a simple application that allows the user to take a photo using the dispatchTakePictureIntent() that saves the full-size photo; indicated here; http://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent. And launched using a Camera icon from the action bar. The user then takes a photo presses ok and their picture appears in a list created using a class extending BaseAdapter
public boolean onOptionsItemSelected(MenuItem item) {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
dispatchTakePictureIntent();
}
return super.onOptionsItemSelected(item);
}
If I launch the intent as above then everything seems to work fine but I have no response to the delete all button (clicking it would ofc just start the camera intent)
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_photo : {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
dispatchTakePictureIntent();
}
}
case (R.id.action_delete) : {
deleteAllPhotos();
}
}
return super.onOptionsItemSelected(item);
}
However when setup like this I can delete the photos, but the previously taken photo dissapears every time I click the camera icon to take a new photo
Is there any subtle change in lifecycle or anything introduced by this difference? As I am struggling to find how it can cause this different behaviour.
Thanks for any input!
You're missing a break or return statement after your case, so it launches the intent and then deletes all of your previous photos since case statements fall thru to the next one if not told to break.
Try:
switch(item.getItemId()) {
case R.id.action_photo:
...
break;
case R.id.action_delete:
...
break;
}
I'm using ActionBarCompat to make an actionbar for devices under API 11.
It works great and was easy to setup, but I'm stuck.
I have some items on the Actionbar, and it looks great.
Some Items are behind the three dots (ifRoom) and some you always can see.
How do I make so when you click on one of these items so it starts an new Activity?
I tried with switch/case and other methods, but didnt work to send from one Activity to another through the Items. I know how to send from button, imagebutton to another Activity, but not from Items.
My main.xml looks like this:
<item
android:id="#+id/add"
android:title="Lägg till"
android:icon="#drawable/new"
android:orderInCategory="1"
budsnabben:showAsAction="always"/>
And the code in MainActivity looks like this:
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.:
Intent intent = new Intent(this, MapActivity.class);
this.startActivity(intent);
break;
case R.id.menu_item2:
// another startActivity, this is for item with id "menu_item2"
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
}
The problem is on case R.id.... After Id, I dont get my class map or main, its not there.
Thank you.
SOLUTION:
Just want to thank you Gerard.
I created new Strings in strings.xml.
After that, I did change the title in my main.xml to this:
android:title="#string/add"
I did hard-coded that line like before, therefore it didn't work I think:
android:title="#+id/add"
Thank you once more.
Use public boolean onOptionsItemSelected(MenuItem item) { ... } in your activity using the actionbar and create a switch-case matching item.getItemId() with the IDs from the menu layout. After that creating the appropriate intent like you would on a regular button.
Action Bar
I'm talking about the (Number 1, in the pic), button with a little arrow and the app icon and the top left side of the screen. It is automatically defined when we select the "Black activity" template.
My app has a pretty huge hierarchy graph, got about 25 activities now.
I'm basically just showing a few tutorials and one can navigate to it according to the categories.
Now that "Back" (?) button thingy on action bar is on every screen I have, and I do want to keep it. The code shows no error, but when I actually press that button, the app stops working.
What I want, is to just replicate the actual back button function with that (Number 1) button, that I showed in the image.
When I press it, the top most screen should close, and the last one should open. Just close the screen.
What I tried :
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
this is the the function that inflates that buggy button along with the action bar. I tried to replace the entire code, and call "Finish" function, but that failed miserably.
I was unable to find a function specifically made for that top left most button...
I want the top most screen on the stack(the one in the foreground) to close, when this button is touched.
How to do this ?
I think the easiest way out is follows:
I am assuming that from activity A you are starting the activity B. Now from activity B you want to go back to activity A on pressing the top left back button on action bar. simply call this.finish() or ActivityName.this.finish() from there:
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.finish();
return true;
}
return super.onOptionsItemSelected(item);
}
This should finish your current activity. However if you have lot of activities, then you might have to do this in all the activities. To save yourself from that effort, you can make a class lets call it AbstractActivity; that extends Activity. Then you can extend all your other activity classes to extend that class(AbstractActivity). Inside AbstractActivity you can put the above code. So now that piece of code would be valid for all your activities and that feature would be implemented for all of them. Basically this sort of thing (Inheritance)can be used any time, when there are some common features which would be applicable to your many classes.
If you are receiving any errors, please do post your LogCat if you require further help.
Hope this helps you.
just giving basic code given by #shobhit puri...
for invoking the action bar back button..add the following code in the onCreate() method along with the onOptionsItemSelected....
protected void onCreate(Bundle savedInstanceState)
{
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_information);
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.finish();
return true;
}
return super.onOptionsItemSelected(item);
}