Android:如何从optionmenu启动活动?

时间:2015-07-16 15:37:22

标签: android android-intent optionmenu

我已在论坛中阅读了几个问题,并在我的代码上进行了尝试。但我的应用程序中的此功能尚未运行。

我有两项活动。第一个是MapsActivity.java。它包含一个谷歌地图,我添加了一些标记(使用谷歌地图Android API创建)。第二个是supersural.java。 我已经能够从第一个活动转移到第二个活动。 在第二个活动中,我在底部插入了一个选项菜单,我想为每个选项启动不同的活动。 第一个选项是一个图标,单击该图标时,应该将我带回MapsActivity.java 由于我不明白的原因,当我点击图标时,没有任何反应。

我认为我的代码与问题相关:

我已宣布我的两项活动的AndroidManifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mgiannone.dublinfarmersmarket" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key" />

    <activity
        android:name=".MapsActivity"
        android:label="@string/title_activity_maps" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".supernatural"
        android:label="@string/title_activity_supernatural" >
    </activity>
</application>

菜单.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.mgiannone.dublinfarmersmarket.supernatural">
<item android:id="@+id/action_settings"   android:title="@string/action_settings"
    android:orderInCategory="100" app:showAsAction="never" />

<item android:id="@+id/map"
    android:title="@string/iconMap"
    android:orderInCategory="200"
    android:icon="@drawable/ic_action_maps_place"
    app:showAsAction="always"/>

<item android:id="@+id/review"
    android:title="@string/iconReview"
    android:orderInCategory="200"
    android:icon="@drawable/ic_action_action_question_answer"
    app:showAsAction="always"/>

</menu>

supenatural.java类

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v7.widget.Toolbar;


public class supernatural extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_supernatural);

    //declare a Toolabr and inflate it
    Toolbar myToolbar = (Toolbar)findViewById(R.id.myToolbar);
    myToolbar.inflateMenu(R.menu.menu_supernatural);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_supernatural, menu);
    return true;
    }


@Override
public boolean onOptionsItemSelected(MenuItem item) {

    //handling the options selected
    switch (item.getItemId()) {
        case R.id.map:
            // Map option clicked.
            Intent intentMap = new Intent(this, MapsActivity.class);
            this.startActivity(intentMap);
            return true;
        case R.id.review:
            // Review option clicked.
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

}
}

目前我唯一能想到的是MapsActivity.java文件存在的某种问题。我应该使用特定方法来调用使用Google Maps Android API创建的此类活动吗? 为了完整起见,我还要添加MapsActivity.java类的代码:

import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap myMap) {
    // Move the camera to Dublin
    myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(53.345350459503486, -6.272483224804773), 12));

    //Set the markers on the map
    Marker greenDoor = myMap.addMarker(new MarkerOptions()
            .position(new LatLng(53.33783832056784, -6.277552599842919))    //set latitude and longitude
            .title("The Green Door")                                        //set a title for the marker
            .snippet("18 Newmarket, Dublin 8")                              //set additional text for the marker once it is touched by the user
            .icon((BitmapDescriptorFactory.fromResource(R.drawable.farmstand)))  //change the default icon to a customized one imported in 'drawable'
    );

    Marker supernaturalFM = myMap.addMarker(new MarkerOptions()
                    .position(new LatLng(53.342849229144676, -6.242303008969202))
                    .title("Supernatural")
                    .snippet("114 - 116 Pearse Street, Dublin 2")
                    .icon((BitmapDescriptorFactory.fromResource(R.drawable.farmstand)))
    );



    myMap.setOnInfoWindowClickListener(
            new OnInfoWindowClickListener(){
                public void onInfoWindowClick(Marker supernaturalFM){
                    Intent nextScreen = new Intent(MapsActivity.this,supernatural.class);
                    startActivity(nextScreen);
                }
            }
    );

};

3 个答案:

答案 0 :(得分:0)

尝试在交换机中添加断点:插入break;在所有情况下return true;之后

如果您不使用break,则调用的操作将是最后一次

答案 1 :(得分:0)

我建议你在每个案例结束时使用break,然后你可以使用:

                Intent act = new Intent(this, MapsActivity.class);
                startActivity(act);

但是,如果你想从第二个活动接收数据,你应该在第一个活动中使用startActivityForResult(),所以你有一个返回值

<强>更新 这是这种方法的基本结构:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    int id = item.getItemId();
    if (id == R.id.my_id)
    {
        return true;
    }
    else
    if (id == R.id.second_id)
    {
        Toast.makeText(this, "you press a button!, success ", Toast.LENGTH_LONG).show();
        Intent act = new Intent(this, MapsActivity.class);
        startActivity(act);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

答案 2 :(得分:0)

你绝对是在正确的轨道上,但你需要纠正一个小错误。

在个人break中使用case

@Override
public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.map:
                // Map option clicked.
                Intent intentMap = new Intent(this, MapsActivity.class);
                this.startActivity(intentMap);
                break;
            case R.id.review:
                // Review option clicked.
                break;
        }

        return super.onOptionsItemSelected(item);
}