0

webview の子アクティビティで戻るボタンを押すと強制終了します。子のアクティビティを終了して、前のクラスに移動したいです。私のタブグループアクティビティは次のとおりです

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

誰かがこの問題を解決するのを手伝ってくれませんか..今は半日これに固執しています。

4

1 に答える 1

0

独自の WebView を実装し、その onBackPress をオーバーライドします。ここに疑似コードがあります

1) クラス ABC extends WebView を実装する

2)ABCで.. onBackPressをオーバーライドする

3) onBackPress() { 終了(); }

于 2012-12-10T12:14:35.447 に答える