Как использовать startActivityForResult () в ActivityGroup? - PullRequest
1 голос
/ 29 октября 2011

Я использую TabActivity с некоторыми вкладками, каждая вкладка содержит ActvityGroup, каждая ActivityGroup управляет более чем одним Activity.У одной из ActivtyGroup есть три Activies: A, B и C.

Сначала создается A, когда пользователь нажимает кнопку в A, он переходит к B.

в B есть некоторые важные данные, которые можно редактировать в C, при нажатии на кнопку «редактировать» в B, она переходит к C.

если некоторые данные редактируются в C, когда я нажимаю кнопку назад, я хочу изменить те же данные в B. Что сводит меня с ума, так это то, что когда я использую «finish ()» в классе C, мое приложение закрывается напрямую.

Я искал много решений в сети, но ни одно из них не подходит для моего случая, я не знаю, в чем дело, пожалуйста, помогите мне или приведите пример использования startActivityForResult () в ActivityGroup

вот моя группа:

public class MyGroup extends ActivityGroup 
{

private int ID=0;
private AlertDialog dialog;
private Stack<View>history;                
private LocalActivityManager manager;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    history = new Stack<View>();
    manager = getLocalActivityManager();

    Intent intent = new Intent(this,A.class);
    startActivity(intent);
}

@Override
public void startActivity(Intent intent) 
{
    View view = manager.startActivity(""+ID++,intent).getDecorView();
    history.push(view);
    setContentView(view);
}

@Override
public void startActivityForResult(Intent intent,int requestCode)
{
    // super.startActivityForResult(intent, requestCode);
    View view = manager.startActivity(""+ID++,intent).getDecorView();
    history.push(view);
    setContentView(view);
}

/*
 * if user edited data in C.class.
 * when C.class finished,refresh data in the B.class
 */
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
    Log.e("MyGroup","running");
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==RESULT_OK)
    {
           //modify data in B.java
        B subActivity=(B)(manager.getCurrentActivity());
        subActivity.handleActivityResult(requestCode, resultCode, data);
    }
}

/*
 * when press back button, manage which page to show next
 * if there is one page in stack,that means when press back button it will
 * exit the app,so we add a dialog to notify user whether exit app or not
 */
@Override
public void onBackPressed()
{
    int size=history.size();
    if ( history.size()>= 2) 
    {
        history.remove(size-1);
        setContentView(history.get(size-2));
    }
    else
    {
        if(dialog==null)
        {
            createDialog();
        }
        dialog.show();
    }   
}  
}  

в B.class:

     public void nextPage()
     {
      Intent intent=new Intent(B.this,C.class);
      intent.putExtra("name", productAdapter.getName(position));
      intent.putExtra("id", productAdapter.getID(position));    
      B.this.getParent().startActivityForResult(intent,11);
     }

    /*
     * modify data in modifyItem
     */
      public void handleActivityResult(int requestCode,int resultCode,Intent data)
     {
      String price=data.getExtras().getString("price");
      String name=data.getExtras().getString("name");
      String quantity=data.getExtras().getString("quantity");
      productAdapter.setName(name, modifyItem);
      productAdapter.setPrice(price, modifyItem);
      productAdapter.setQuantity(quantity, modifyItem);
      productAdapter.notifyDataSetChanged();
   }

в C.class:

@Override
public void onBackPressed() 
{
    if(price!=null)
    {
        Bundle bundle=new Bundle();
        bundle.putString("name",name);
        bundle.putString("price",price);
        bundle.putString("quantity",quantity);

        this.getParent().setResult(RESULT_OK,new Intent().putExtras(bundle));
        this.finish();
        Log.e("C","inner");
    }
    Log.e("C","outer");
    this.getParent().onBackPressed();
}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2014

Ваша активность из ActivityGroup не будет получать ответные вызовы напрямую.Вам нужно перенаправить из ActivityGroup.Пожалуйста, смотрите ответ ниже Вот решение.Пожалуйста, попробуйте это

https://stackoverflow.com/a/15047518/1403112

0 голосов
/ 19 ноября 2011

Почему ты называешь финиш? Нажатие назад означает, что он уничтожит

...