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.container
的FrameLayout
用于Fragment
s事务...
【参考方案1】:
试试这个..
删除Spinner
和所有CheckBox
从MainActivity
到PlaceholderFragment
,如下所示
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】:你所有的View
s 都不属于你的activity_main.xml
。它们是您的PlaceHolderFragment
的一部分。因此,当您调用 findViewById()
(例如 findViewById(R.id.spinnerOption)
)时,它们只会返回 null
,因为它们不属于 Activity
视图层次结构...
因此,首先将PlaceHolderFragment
添加到Activity
,然后调用findViewById()
,否则将所有View
s 声明及其实现移至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 您需要将MapFragment
或MapView
添加到您的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.exec() Payload
使用java.lang.Runtime.getRuntime无法在matlab中调用多个python脚本实例