0

我正在尝试使用活动组-因为我使用选项卡,并且希望在单击列表项后加载和活动时拥有选项卡。但我在以下行中得到了 nullpointerexception:

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);
        }
....

更新:我的小组活动是这样的:我找不到问题所在。,

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);
    }
}
4

3 回答 3

1

遇到了同样的问题,当您尝试(重新)启动与先前销毁的 Activity 具有相同 ID 的 Activity 时,似乎存在(或曾经) LocalActivityManager 的错误。由于destroyActivity 方法中的一个错误,它将简单地返回 null 作为 Window 。我正在使用的解决方法,使用反射来正确销毁活动(解决方法后的详细说明):

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;
}

这是一种解决方法,因为 LocalActivityManager.destroyActivity(...) 在多个 API 版本中包含一个错误。该方法没有正确地从其 HashMap(LocalActivityManager 的源)中删除 Activity:

     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) 语句应如下删除正在销毁的活动的 LocalActivityRecord:

if (finish) {
    mActivities.remove(id);    //--> mActivities should remove the id
    mActivityArray.remove(r);  //--> mActivitiesArray should remove the 'r object' (LocalActivityRecord)
}

虽然他们说它正在为 Froyo 修复,但我仍然在运行 2.3.3 的三星 Galaxy S2 上遇到它

于 2011-10-04T14:26:23.943 回答
1

我有同样的问题。为了解决这个问题,我按照第一个答案的建议将多呼叫线路分解为三行:

            LocalActivityManager processManager =activityGroup.group.getLocalActivityManager();
            Window w = processManager.startActivity("ActivityOne", myIntent);
            View view = w.getDecorView();

然后发现第一行就是问题所在。因为我从活动组之外的活动中调用 ActivityOne(它是不同选项卡下的活动),所以尚未初始化静态“activityGroup.group....”。因此,相当笨拙的修复是在启动意图之前切换到该选项卡并返回到该选项卡。因此,在上面的代码之前添加以下内容:

            AppName.switchToTab(2);  
            AppName.switchToTab(1); 

这样就成功了,您看不到选项卡开关。一个更整洁的解决方案可能是在启动时切换到所有选项卡以确保它们都已初始化......

于 2011-03-23T15:58:36.807 回答
0

不确定您是如何实现 ActivityGroup 的,但该组需要是一个静态变量。

我在 google 上找到了本教程,它描述了如何实现 ActivityGroup。 http://blog.henriklarsentoft.com/2010/07/android-tabactivity-nested-activities/

希望这会有所帮助,托拜厄斯

于 2011-02-06T11:05:29.357 回答