2012-12-10 5 views
0

웹 뷰에서 자식 활동의 뒤로 버튼을 누르면 강제 종료됩니다. 나는 어린이 활동을 끝내고 이전 반으로 옮기고 싶다. 내 tabgroupactivity는 다음과 같습니다.활동 그룹 tabhost에서 하위 탭 그룹에서 완료 android

import java.lang.reflect.Field; 


import java.util.ArrayList; 


import java.util.Map; 

import android.app.Activity; 

import android.app.ActivityGroup; 

import android.app.LocalActivityManager; 

import android.content.Intent; 

import android.os.Bundle; 

import android.view.KeyEvent; 

import android.view.Window; 

/** 
* The purpose of this Activity is to manage the activities in a tab. 

* Note: Child Activities can handle Key Presses before they are seen here. 

* @author Eric Harlow 

*/ 
public class TabGroupActivity extends ActivityGroup { 

    private ArrayList<String> mIdList; 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState);  

     if (mIdList == null) mIdList = new ArrayList<String>(); 
    } 

    /** 
    * This is called when a child activity of this one calls its finish method. 
    * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity 
    * and starts the previous activity. 
    * If the last child activity just called finish(),this activity (the parent), 
    * calls finish to finish the entire group. 
    */ 

    @Override 

    public void finishFromChild(Activity child) { 

     LocalActivityManager manager = getLocalActivityManager(); 

     int index = mIdList.size()-1; 

     if (index < 1) { 

      finish(); 

      return; 


     } 
     System.out.println("Destroy called"); 

     boolean rt=destroy(mIdList.get(index),manager); 

     System.out.println("Destroy called"+rt); 

//  manager.destroyActivity(mIdList.get(index), true); 

     mIdList.remove(index); index--; 

     String lastId = mIdList.get(index); 

     Intent lastIntent = manager.getActivity(lastId).getIntent(); 

     Window newWindow = manager.startActivity(lastId, lastIntent); 

     setContentView(newWindow.getDecorView()); 
    } 

    /** 
    * Starts an Activity as a child Activity to this. 

    * @param Id Unique identifier of the activity to be started. 

    * @param intent The Intent describing the activity to be started. 

    * @throws android.content.ActivityNotFoundException. 
    */ 

    public void startChildActivity(String Id, Intent intent) { 

     Window window = 

getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 

     if (window != null) { 

      mIdList.add(Id); 

      setContentView(window.getDecorView()); 
     }  
    } 


    /** 
    * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR 

    * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown. 

    */ 

    @Override 

    public boolean onKeyDown(int keyCode, KeyEvent event) { 

     if (keyCode == KeyEvent.KEYCODE_BACK) { 

      //preventing default implementation previous to 

android.os.Build.VERSION_CODES.ECLAIR 

      return true; 
     } 

     return super.onKeyDown(keyCode, event); 
    } 

    /** 
    * Overrides the default implementation for KeyEvent.KEYCODE_BACK 

    * so that all systems call onBackPressed(). 

    */ 
    @Override 

    public boolean onKeyUp(int keyCode, KeyEvent event) { 

     if (keyCode == KeyEvent.KEYCODE_BACK) { 

      onBackPressed(); 

      return true; 
     } 

     return super.onKeyUp(keyCode, event); 

    } 

    /** 
    * If a Child Activity handles KeyEvent.KEYCODE_BACK. 

    * Simply override and add this method. 

    */ 

    public void onBackPressed() { 

     int length = mIdList.size(); 

     if (length > 1) { 

      Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); 

      System.out.println("Activity Being close"+current.getLocalClassName()); 

      this.finishFromChild(current); 
     } 
    } 

    public boolean destroy(String id,LocalActivityManager activityManager) { 


    if(activityManager != null){ 

     activityManager.destroyActivity(id, false); 

     // http://code.google.com/p/android/issues/detail?id=12359 

     // http://www.netmite.com/android/mydroid/frameworks/base/core/java/android 

/app/LocalActivityManager.java 

     try { 

     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) { 

     e.printStackTrace(); 
     } 

     return true; 

    } 

    return false; 
    } 

} 

나는 finish(), this.finish()를 사용했으나 강제 종료 오류가 발생합니다.

내 기록은 다음과 같습니다. 에 ... TabGroupActivity.finishFromChild

(TabGroupActivity.java:54는)

라인 (54)은

에있다
String lastId = mIdList.get(index); 

사람이 문제 해결에 .. 반이에 붙어 오전 나를 도울 수 오늘.

답변

0

WebView를 구현하고 onBackPress를 재정의하십시오. 여기서 의사

1) ABC는 ABC에서

2 웹보기

) 연장를 구현하고있다 ..) (onBackPress에서 onBackPress

3)() {마무리 무시; }

+0

자습서가 있습니까? – Dimitri

+0

Sophia, 오류 메시지 또는 예외가 무엇인지 알 수 있습니까? 찾으려면 logcat을 확인하십시오. –