Android ActivityGroup-NullPointerException
我正在尝试使用活动组-因为我使用选项卡,并且希望在单击列表项后加载和活动时使用这些选项卡,。但我在下面一行中得到了nullpointerexception:Android ActivityGroup-NullPointerException,android,android-activity,nullpointerexception,activitygroup,Android,Android Activity,Nullpointerexception,Activitygroup,我正在尝试使用活动组-因为我使用选项卡,并且希望在单击列表项后加载和活动时使用这些选项卡,。但我在下面一行中得到了nullpointerexception: View view1 = S1_Group.group.getLocalActivityManager() .startActivity("S1", intent) .getDecorView(); 代码是 lv.setOnItem
View view1 = S1_Group.group.getLocalActivityManager()
.startActivity("S1", intent)
.getDecorView();
代码是
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(getApplicationContext(), S1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Log.d("test","Before view");
try{
View view1 = S1_Group.group.getLocalActivityManager()
.startActivity("S1", intent)
.getDecorView();
Settings_Group.group.setContentView(view1);
}
catch (Exception e){
Log.e("test","view failded:"+e);
}
....
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Intent Intent=新的Intent(getApplicationContext(),S1.class);
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
日志d(“测试”、“查看前”);
试一试{
查看视图1=S1_Group.Group.getLocalActivityManager()
.起始触觉(“S1”,意图)
.getDecorView();
设置\u Group.Group.setContentView(视图1);
}
捕获(例外e){
Log.e(“测试”,“视图失败:+e”);
}
....
更新:我的小组活动是这样的:我找不到问题所在
public class S1_Group extends ActivityGroup {
public static S1_Group group;
private ArrayList<View> history;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.history = new ArrayList<View>();
group = this;
View view = getLocalActivityManager().startActivity("F1",
new Intent(this, F1.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
setContentView(view);
}
}
公共类S1\u组扩展了ActivityGroup{
公共静态S1_组;
私家侦探史;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
this.history=new ArrayList();
组=此;
View=getLocalActivityManager().startActivity(“F1”,
新建Intent(this,F1.class).addFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP)).getDecorView();
setContentView(视图);
}
}
不确定如何实现ActivityGroup,但该组需要是一个静态变量
我在google上找到了这个教程,它描述了如何实现ActivityGroup。
希望这有帮助,
托拜厄斯我也遇到了同样的问题。为了解决这个问题,我将多重呼叫线路分解为三条线路,正如第一个答案所示:
LocalActivityManager processManager =activityGroup.group.getLocalActivityManager();
Window w = processManager.startActivity("ActivityOne", myIntent);
View view = w.getDecorView();
然后发现第一行是问题所在。因为我正在从活动组之外的活动(它是另一个选项卡下的活动)调用ActivityOne,所以静态的“activityGroup.group…”尚未初始化。因此,相当麻烦的修复方法是在启动intent之前切换到该选项卡并返回到此选项卡。因此,在上面的代码之前添加以下内容:
AppName.switchToTab(2);
AppName.switchToTab(1);
这就解决了问题,你看不到选项卡切换。一个更整洁的解决方案可能是在启动时切换到所有选项卡,以确保它们都已初始化…遇到了相同的问题,并且似乎在你尝试(重新启动)时,LocalActivityManager存在(或曾经存在)一个错误启动一个ID与以前销毁的活动相同的活动。由于destroyActivity方法内部存在错误,它将作为窗口简单地返回null。我使用的解决方案使用反射正确销毁活动(解决方案后的详细说明):
虽然他们说Froyo正在修复它,但我仍然在运行2.3.3的三星galaxy S2上遇到了它。基本调试步骤:如果你在一行上得到一个NPE,它有几个链。“调用,例如,
a().b().c().d()
,那么这些方法中很可能有一个返回null。将这行拆分为单独的调用,例如X=a”();yy=x.b();zz=Y.c();ww=Z.d()
,并添加检查以查看哪个返回null。
public boolean destroyActivityWorkAround(String id) {
final LocalActivityManager activityManager = getLocalActivityManager();
if(activityManager != null){
activityManager.destroyActivity(id, false);
try {
// Use reflection to get to the HashMaps with the records(which activities are started ect.)
// to remove the records properly
// http://code.google.com/p/android/issues/detail?id=10083
final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
if(mActivitiesField != null){
mActivitiesField.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<String, Object> mActivities = (Map<String, Object>)mActivitiesField.get(activityManager);
if(mActivities != null){
mActivities.remove(id);
}
final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
if(mActivityArrayField != null){
mActivityArrayField.setAccessible(true);
@SuppressWarnings("unchecked")
final ArrayList<Object> mActivityArray = (ArrayList<Object>)mActivityArrayField.get(activityManager);
if(mActivityArray != null){
for(Object record : mActivityArray){
final Field idField = record.getClass().getDeclaredField("id");
if(idField != null){
idField.setAccessible(true);
final String _id = (String)idField.get(record);
if(id.equals(_id)){
mActivityArray.remove(record);
break;
}
}
}
}
}
}
} catch (Exception e) {
Log.e(LOGTAG, this.getClass().getSimpleName() + ".destroyActivityWorkAround() removing activity using reflection failed with error:", e);
//e.printStackTrace();
}
return true;
}
return false;
}
public Window destroyActivity(String id, boolean finish) {
LocalActivityRecord r = mActivities.get(id); //<-- id's are the key's for the HashMap
Window win = null;
if (r != null) {
win = performDestroy(r, finish);
if (finish) {
mActivities.remove(r); //--> This works on id's not the 'r object', this doesn't remove anything
}
}
return win;
}
if (finish) {
mActivities.remove(id); //--> mActivities should remove the id
mActivityArray.remove(r); //--> mActivitiesArray should remove the 'r object' (LocalActivityRecord)
}