Domanda

I have been using TabActivity and I want the tab to display on every child activity. I have flow like this MainActivity(TabActivity) -> TabGroupActivity1(TabGroupActivity) -> Activity1 -> Activity2

Now i want to redirect on Activity2 only if the flag is true. so that my code for that is something like bellow.

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

now code for TabGroupActvity1

public class TabGroupActyvity1 extends TabGroupActivity {

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


}

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

this is not working,

the same code the one in bellow works in some click event but not working in my case

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

please give some suggestion how to do this. have I explain the problem well... do I need to add some more details?

È stato utile?

Soluzione

Okay, I found other alternative.

Instead of... checking flag in the child activity and redirecting on different page.

I am checking the flag in the parnt activity Like this

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

and from LoginActivity on Successful login i am Starting ReportActivity like bellow

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

and I also handle the back press as of I don't want user to go back on login page again. I handle the back key in TabGroupActivity

like this

@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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top