Android Java.Lang.RuntimeException:无法启动活动组件信息

Posted

技术标签:

【中文标题】Android Java.Lang.RuntimeException:无法启动活动组件信息【英文标题】:Android Java.Lang.RuntimeException : Unable to start activity Component Info 【发布时间】:2014-04-29 17:38:23 【问题描述】:

我是安卓程序员的新手。最近,我尝试在 android 应用程序中制作使用 google map v2 的项目,但出现了很多错误(我已将 google play 服务添加到我的库中并在此处找到类似的主题,但没有解决我的问题)。请看看我的日志猫:

已更新

03-22 13:52:29.331:E/AndroidRuntime(17708):致命异常:主要 03-22 13:52:29.331: E/AndroidRuntime(17708): java.lang.RuntimeException: 无法恢复活动 com.yai.testmap/com.yai.testmap.MainActivity: java.lang.NullPointerException 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2613) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2641) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2127) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread.access$600(ActivityThread.java:140) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.os.Looper.loop(Looper.java:137) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread.main(ActivityThread.java:4895) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 java.lang.reflect.Method.invoke(Method.java:511) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 03-22 13:52:29.331: E/AndroidRuntime(17708): at dalvik.system.NativeStart.main(Native Method) 03-22 13:52:29.331: E/AndroidRuntime(17708): 由: java.lang.NullPointerException 引起 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 com.yai.testmap.MainActivity.setUpMapIfNeeded(MainActivity.java:93) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 com.yai.testmap.MainActivity.onResume(MainActivity.java:187) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1199) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.Activity.performResume(Activity.java:5237) 03-22 13:52:29.331: E/AndroidRuntime(17708): 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2603) 03-22 13:52:29.331: E/AndroidRuntime(17708): ... 12 更多

更新

我的 MainActivity.java :

包 com.yai.testmap; 导入android.support.v7.app.ActionBarActivity; 导入android.support.v4.app.Fragment; 导入android.os.Bundle; 导入 android.view.LayoutInflater; 导入 android.view.Menu; 导入android.view.MenuItem; 导入android.view.View; 导入android.view.ViewGroup; /* 报告错误 */ 导入android.util.Log; /* 导入使用此项目的下拉列表 */ 导入 android.widget.CheckBox; 导入 android.widget.Spinner; 导入 android.widget.Toast; 导入 android.widget.AdapterView; 导入 android.widget.ArrayAdapter; 导入 android.widget.AdapterView.OnItemSelectedListener; /* 导入谷歌地图 */ 导入 com.google.android.gms.maps.GoogleMap; 导入 com.google.android.gms.maps.SupportMapFragment; /* 谷歌地图类型 */ 导入静态 com.google.android.gms.maps.GoogleMap.MAP_TYPE_HYBRID; 导入静态 com.google.android.gms.maps.GoogleMap.MAP_TYPE_NONE; 导入静态 com.google.android.gms.maps.GoogleMap.MAP_TYPE_NORMAL; 导入静态 com.google.android.gms.maps.GoogleMap.MAP_TYPE_SATELLITE; 导入静态 com.google.android.gms.maps.GoogleMap.MAP_TYPE_TERRAIN; 类 PlaceholderFragment 扩展 Fragment 实现 OnItemSelectedListener 私人谷歌地图 mGoogleMap; 私有复选框 mTrafficCheckbox、mLocationCheckbox、mBuildingCheckbox、mIndoorCheckbox; 公共占位符片段() @覆盖 public View onCreateView(LayoutInflater inflater, ViewGroup 容器, Bundle savedInstanceState) 查看 rootView = inflater.inflate(R.layout.fragment_main, container, false); Spinner spinner = (Spinner) rootView.findViewById(R.id.spinnerOption); ArrayAdapter 适配器 = ArrayAdapter.createFromResource(getActivity(), R.array.spinner_option_string, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(适配器); spinner.setOnItemSelectedListener((OnItemSelectedListener) getActivity()); mTrafficCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_traffic); mLocationCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_location); mBuildingCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_building); mIndoorCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_indoor); 返回根视图; @覆盖 public void onItemSelected(AdapterView parent, View view, int position, 长身份证) // TODO 自动生成的方法存根 @覆盖 公共无效 onNothingSelected(AdapterView 父) // TODO 自动生成的方法存根 公共类 MainActivity 扩展 ActionBarActivity 实现 OnItemSelectedListener 私人谷歌地图 mGoogleMap; 私有复选框 mTrafficCheckbox、mLocationCheckbox、mBuildingCheckbox、mIndoorCheckbox; @覆盖 protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); 私人无效 setUpMapIfNeeded() 如果(mGoogleMap == null) mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 私人布尔检查就绪() 如果(mGoogleMap == null) Toast.makeText(this, R.string.map_not_ready, Toast.LENGTH_SHORT).show(); 返回假; 返回真; 私人无效更新流量() 如果(!checkReady()) 返回; mGoogleMap.setTrafficEnabled(mTrafficCheckbox.isChecked()); 公共无效 onTrafficToggled(查看视图) 更新交通(); 私人无效更新位置() 如果(!checkReady()) 返回; mGoogleMap.setMyLocationEnabled(mLocationCheckbox.isChecked()); public void onLocationToggled(查看视图) 更新位置(); 私人无效更新建筑() 如果(!checkReady()) 返回; mGoogleMap.setBuildingsEnabled(mBuildingCheckbox.isChecked()); 公共无效 onBuildingToggled(查看视图) 更新建筑(); 私人无效更新室内() 如果(!checkReady()) 返回; mGoogleMap.setIndoorEnabled(mIndoorCheckbox.isChecked()); 公共无效 onIndoorToggled(查看视图) 更新室内(); @覆盖 public void onItemSelected(AdapterView parent, View view, int position, long id) setLayer((String) parent.getItemAtPosition(position)); 私人无效setLayer(字符串层名称) 如果(!checkReady()) 返回; if(layerName.equals(getString(R.string.normal))) mGoogleMap.setMapType(MAP_TYPE_NORMAL); 否则 if(layerName.equals(getString(R.string.hybrid))) mGoogleMap.setMapType(MAP_TYPE_HYBRID); 否则如果(layerName.equals(getString(R.string.satellite))) mGoogleMap.setMapType(MAP_TYPE_SATELLITE); 否则如果(layerName.equals(getString(R.string.terrain))) mGoogleMap.setMapType(MAP_TYPE_TERRAIN); 否则 if(layerName.equals(getString(R.string.none_map))) mGoogleMap.setMapType(MAP_TYPE_NONE); 别的 Log.i("LDA", "错误设置层名称" + layerName); @覆盖 公共无效 onNothingSelected(AdapterView 父) @覆盖 受保护的无效 onResume() 超级.onResume(); setUpMapIfNeeded(); 如果(mGoogleMap!= null) 更新交通(); 更新位置(); 更新建筑(); 更新室内(); @覆盖 公共布尔 onCreateOptionsMenu(菜单菜单) // 膨胀菜单;如果存在,这会将项目添加到操作栏。 getMenuInflater().inflate(R.menu.main, menu); 返回真; @覆盖 public boolean onOptionsItemSelected(MenuItem item) // 处理操作栏项目点击这里。操作栏将 // 自动处理对 Home/Up 按钮的点击,这么久 // 当您在 AndroidManifest.xml 中指定父活动时。 int id = item.getItemId(); 如果(id == R.id.action_settings) 返回真; 返回 super.onOptionsItemSelected(item); /** * 一个包含简单视图的占位符片段。 */ 公共静态类 PlaceholderFragment 扩展片段 公共占位符片段() @覆盖 public View onCreateView(LayoutInflater inflater, ViewGroup 容器, 捆绑保存的InstanceState) 查看 rootView = inflater.inflate(R.layout.fragment_main, 容器, 错误的); 返回根视图;

我这里用的是fragment,所以这里是fragment_main.xml:

<?xml version="1.0" encoding="utf-8" ?>

    <Spinner
        android:id="@+id/spinnerOption"
        android:layout_
        android:layout_ />

    <CheckBox 
        android:id="@+id/checkbox_traffic"
        android:layout_
        android:layout_
        android:onClick="onTrafficToggled"
        android:text="@string/traffic" />

    <CheckBox
        android:id="@+id/checkbox_location"
        android:layout_
        android:layout_
        android:onClick="onLocationToggled"
        android:text="@string/location" />

    <CheckBox
        android:id="@+id/checkbox_building"
        android:layout_
        android:layout_ 
        android:onClick="onBuildingsToggled"
        android:checked="true"
        android:text="@string/building" />

    <CheckBox
        android:id="@+id/checkbox_indoor"
        android:layout_
        android:layout_
        android:onClick="onIndoorToggled"
        android:checked="true"
        android:text="@string/indoor" />
</LinearLayout>
</RelativeLayout>   

还有我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yai.testmap"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="17" />

<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" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"
/>

<application
    android:allowBackup="true"
    android:icon="@drawable/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" 
    />

    <activity
        android:name="com.yai.testmap.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data 
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="SUPER SCREET CODE"
        />
</application>

</manifest>

这里是我的 activity_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_
android:layout_
tools:context="com.yai.testmap.MainActivity"
tools:ignore="MergeRootFrame" />

我对我的 Spinner 和函数 setUpMapIfNeeded() 很好奇,因为当我评论这部分代码时,我的应用程序可以正常工作。我想念什么?任何想法?非常感谢。

【问题讨论】:

使用setContentView(R.layout.fragment_main);,因为您尝试在 MainActivity 中访问的所有视图都在 fragment_main 布局中,而不是在 activity_main 嗨,感谢您的回复,尽管我正在尝试更改 setContentView(R.layout.fragment_main);它仍然没有解决我的问题。有什么想法吗? ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 正在返回 null... 并且不要将您的内容视图更改为R.layout.fragment_main。让它成为activity_main,因为你需要一个ID为R.id.containerFrameLayout用于Fragments事务... 【参考方案1】:

试试这个..

删除Spinner 和所有CheckBoxMainActivityPlaceholderFragment,如下所示

public static class PlaceholderFragment extends Fragment implements OnItemSelectedListener

    public PlaceholderFragment() 
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);

    Spinner spinner = (Spinner) rootView.findViewById(R.id.spinnerOption);
    ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.spinner_option_string, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(getActivity());

    mTrafficCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_traffic);
    mLocationCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_location);
    mBuildingCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_building);
    mIndoorCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_indoor);

        return rootView;
    

@Override
protected void onCreate(Bundle savedInstanceState)     
    /* CREATE OPTION FOR DROPDOWN LIST*/
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) 
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
       

【讨论】:

您好,感谢您的回复,我刚刚更新了我的 main_activity.java,您是这个意思吗?它仍然没有解决。我真的是 android 编程新手,所以如果我没有得到你,我很抱歉。 @CodingHorror map is null 你在 null 中调用 getMap() 以便出错【参考方案2】:

你所有的Views 都不属于你的activity_main.xml。它们是您的PlaceHolderFragment 的一部分。因此,当您调用 findViewById()(例如 findViewById(R.id.spinnerOption))时,它们只会返回 null,因为它们不属于 Activity 视图层次结构...

因此,首先将PlaceHolderFragment 添加到Activity,然后调用findViewById(),否则将所有Views 声明及其实现移至PlaceHolderFragment

您可以先添加Fragment 添加然后在您的视图上调用findViewById()s...

@Override
protected void onCreate(Bundle savedInstanceState)     
    /* CREATE OPTION FOR DROPDOWN LIST*/
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);

    if (savedInstanceState == null) 
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
       

【讨论】:

怎么做?我刚刚更新了我的帖子。请检查。你是这个意思吗? (main_activity.java)。谢谢 我刚刚更新了我的帖子。请检查一下。我真的需要帮助;)非常感谢。 @CodingHorror 正如我之前所说的,((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 正在返回 null,而您在 null 实例上调用 getMap() 感谢您的帮助。我现在在我的函数 setUpMapIsNeeded 中返回 null,但我该怎么办?删除mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); ?或者用什么改变它?非常感谢。 @CodingHorror 您需要将MapFragmentMapView 添加到您的Activity【参考方案3】:

问题是因为微调器和复选框以及所有其他视图都在

fragment_main.xml

文件。您正在尝试在 MainActivity 中查找该视图的 id,因此每次它都会给您 Null Poniter 异常,因为它位于 PlaceHolderFragment 所以首先将 PlaceHolderFragment 添加到您的 Activity 并找到视图的 ID。看到这个

public static class PlaceholderFragment extends Fragment implements OnItemSelectedListener

public PlaceholderFragment() 


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment_main, container,
            false);

Spinner spinner = (Spinner) rootView.findViewById(R.id.spinnerOption);
ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.spinner_option_string, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(getActivity());

mTrafficCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_traffic);
mLocationCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_location);
mBuildingCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_building);
mIndoorCheckbox = (CheckBox) rootView.findViewById(R.id.checkbox_indoor);

    return rootView;


【讨论】:

以上是关于Android Java.Lang.RuntimeException:无法启动活动组件信息的主要内容,如果未能解决你的问题,请参考以下文章

浅析Java.lang.Runtime类

java中的命令执行汇总

java.lang.Runtime.exec() Payload

使用java.lang.Runtime.getRuntime无法在matlab中调用多个python脚本实例

System.gc()和Runtime.getRuntime().gc()区别

Java基础7Java重要的class类清单