Android: вложенные вкладки не работают с startActivityForResult - PullRequest
3 голосов
/ 06 декабря 2010

Когда я вкладываю TabActivity в другую TabActivity, startActivityForResult завершается ошибкой при вызове из внутренней табуляции. Новое действие начинается, но я получаю сообщение об ошибке:

startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent 

и onActivityResult никогда не вызывается, когда возвращается активность.

Код для воспроизведения найден ниже. Четыре класса, MyActivity является основным классом с двумя вкладками, NestedTab имеет три вкладки, все вкладки содержат SimpleActivity с кнопкой, которая вызывает SimpleDialog:

public class MyActivity extends TabActivity {
/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Populate a couple of tabs
    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, SimpleActivity.class);
    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("simple").setIndicator("Simple")
                  .setContent(intent);
    tabHost.addTab(spec);

    // Repeat
    intent = new Intent().setClass(this, NestedTab.class);
    spec = tabHost.newTabSpec("nested").setIndicator("Nested tabs")
                  .setContent(intent);
    tabHost.addTab(spec);

 }
}

public class NestedTab extends TabActivity {
/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent(this, SimpleActivity.class);

    String tabs[]= {"One", "Two", "Three"};
    for (String s : tabs)
    {
        intent.putExtra("name", s);
        spec = tabHost.newTabSpec(s).setIndicator(s).setContent(intent);
        tabHost.addTab(spec);
    }


}

public class SimpleActivity extends Activity {
Button mBtn;
Context mCtx;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple);
    mCtx = this;
    mBtn = (Button) findViewById(R.id.btn);
     mBtn.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
             //To change body of implemented methods use File | Settings | File Templates.
             startActivityForResult(new Intent(mCtx, SimpleDisplay.class), 1);
         }
     });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);    //To change body of overridden methods use File | Settings | File Templates.
    Toast.makeText(this, "Activity finished", Toast.LENGTH_LONG).show();
}
}


public class SimpleDisplay extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView text = new TextView(this);
    text.setText("Just hit back button");
    setContentView(text);

}
}

Невозможно вставить XML-файлы, но основной файл идентичен шагу 4: http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

и просто это просто текстовое представление и кнопка.

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 06 декабря 2010

Попробуйте SimpleActivity.this.startActivity или ((Activity) view.getContext()).startActivity вместо startActivity. Вы запускаете Активность из вашего OnClickListener вместо вашего Activity в противном случае, отсюда ошибка и отсутствие обратного вызова в onActivityResult.

.

РЕДАКТИРОВАТЬ: Ах, я пропустил двойной вложенный бит. Все становится довольно странно, когда вы дважды вкладываете TabActivity с намерениями на обоих уровнях - посмотрите на исходный код TabActivity, чтобы увидеть, что там происходит, и вы должны быть в состоянии эмулировать его поведение, если действительно хотите.

Суть в том, что ваш onActivityResult будет распространяться только на один уровень ниже; если вы действительно хотите создать вложенную вложенную вкладку на основе Intent (в отличие от вкладок на основе Intent с обычными вложенными вкладками на основе View), вам нужно, чтобы родительская вкладка (с одним вложением) запускала Intent. Чтобы сделать это, попробуйте настроить вкладку с одной вложенностью так, чтобы она вызывала метод, похожий на startActivityAndDispatchToChild, и вызывайте его у дочернего элемента с помощью getParent().startActivityAndDispatchToChild. У этого метода startActivityForResult и переопределите метод getActivityResult на вкладке с одним вложением, используйте код, возвращаемый потомком, чтобы выяснить, к какому потомцу отправлять. Используя этот код, позвоните getLocalActivity().getActivity(whateverTag), чтобы отправить его в нужное место.

Но не делай этого. Просто сделайте так, чтобы ваше занятие второго уровня использовало контент на основе просмотра, а не на основе намерений; если вы действительно хотите отделить то, что делают вложенные страницы, напишите собственный класс ViewGroup для управления содержимым каждой вложенной вкладки.

...