TabGroupActivity - startChildActivity - не работает - PullRequest
0 голосов
/ 31 января 2012

Я использовал TabActivity и хочу, чтобы вкладка отображалась при каждом дочернем действии.У меня есть поток, как это MainActivity(TabActivity) -> TabGroupActivity1(TabGroupActivity) -> Activity1 -> Activity2

Теперь я хочу перенаправить на Activity2, только если флаг имеет значение true.так что мой код для этого что-то вроде ниже.

TabGroupActivity

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

      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.
   */
  @Override
  public void  onBackPressed  () {
      int length = mIdList.size();
      if ( length > 1) {
          Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
          current.finish();
      }  
  }
}

теперь код для TabGroupActvity1

public class TabGroupActyvity1 extends TabGroupActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startChildActivity("OptionsActivity", new Intent(this,Activity1.class));
    }


}

теперь в Activity1

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        if(flag){
            TabGroupActivity parentActivity = (TabGroupActivity)getParent();
            Intent previewMessage = new Intent(parentActivity, Activity2.class);
            parentActivity.startChildActivity("Activity2", previewMessage);
        }else{
            setContentView(R.layout.row);
            //... 
        }
    }

этоне работает,

тот же код, который приведен ниже, работает в некоторых событиях щелчка, но не работает в моем случае

TabGroupActivity parentActivity = (TabGroupActivity)getParent();
Intent previewMessage = new Intent(parentActivity, Activity2.class);
parentActivity.startChildActivity("Activity2", previewMessage);

, пожалуйста, дайте несколько советов, как это сделать.Должен ли я объяснить проблему хорошо ... мне нужно добавить еще детали?

1 Ответ

4 голосов
/ 01 февраля 2012

Хорошо, я нашел другую альтернативу.

Вместо ... проверка флага в дочерней активности и перенаправление на другую страницу.

Я проверяю флаг в активности parnt Как это

if (getLNApplication().isLogin()) {
    startChildActivity("Report", new Intent(this, ReportActivity.class));
}else{
    startChildActivity("LogIn", new Intent(this, LoginActivity.class));
}

и с LoginActivity при успешном входе в систему я начинаю ReportActivity как показано ниже

parentActivity.startChildActivity("EditActivity", new Intent(getParent(), ReportActivity.class));

и я также обрабатываю обратную печать, так как не хочу, чтобы пользователь снова возвращался на страницу входа. Я обращаюсь с ключом назад в TabGroupActivity

как это

@Override
public void onBackPressed() {
    int length = mIdList.size();
    if (length > 1) {
        Activity current = getLocalActivityManager().getActivity(
                mIdList.get(length - 1));
        // Added code to disable back press only for the ReportActivity
        if(current instanceof ReportActivity){
            Log.i("TabGroup", "I am instance of ReportActivity" );
            return;
        }
        current.finish();
    }
}
...