简体   繁体   中英

How to show a new screen from menu item

I'm new to android and trying to find out how to show a new screen when the user clicks something in the menu item.

I'm using ActionbarSherlock and looking at the sample github-android app .

When the user clicks on an item in the menu, I want to show them a new screen. Github code is doing that like so:

startActivityForResult(new Intent(getActivity(), CreateGistActivity.class), GIST_CREATE);

But I've seen some code samples do:

Intent i = new Intent(getApplicationContext(), SomeActivity.class);

My code looks like this:

public class MainActivity extends SherlockActivity {
 ....
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.create) {
        //show createactivity class
        return true;
    }
    return true;
}

What is the right way to do ?

只需使用startActivityForResult

There is no 'right' way. The Github code doesn't first declare the variable. The onther does. I believe for a menu, you normally need to declare the Intent as a local variable, if not a field.

You can do it just like that:

public class MainActivity extends SherlockActivity {
 ....
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.create) {
        //show createactivity class
        Intent i = new Intent(MainActivity.this, SomeActivity.class);
        startActivity(i); 
        return true;
    }
    return true;
}

startActivityForResult is used when you have to return some value/data to the first screen like a user selection. More here

As far as the context to use getActivity() or getApplicationContext() , I prefer to use the context of current activity MainActivity.this its more straitforward similar to documentation example

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

Inside a fragment use getSherlockActivity() instead of getActivity() as getActivity() can cause crashes to older devices.

Of course getApplicationContext() would always work and not crash but I feel that it may mess the garbage collector and do not let activities to be cleared (but not sure about it)

Create an intent: Intent i = new Intent(MainActivity.this, CreateGistActivity.class); where MainActivity is the activity you're in, and CreateGistActivity is the class you want to launch.

Then use startActivity(Intent) to launch the new activity: startActivity(i);

Or just combine them:

startActivity(new Intent(MainActivity.this, CreateGistActivity.class));


Full code:

public class MainActivity extends SherlockActivity {
 ....

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.create) 
    {
        Intent i = new Intent(MainActivity.this, CreateGistActivity.class);  
        startActivity(i);          

        return true;
    }
    return true;
}


startActivityForResult probably isn't needed in your case, unless you're expecting to send values between the classes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM