Вот сделка. У меня есть приложение с тремя вкладками. Благодаря различным взаимодействиям с элементами на вкладках я запускаю другие действия. Клиент просмотрел это и хотел бы, чтобы действия запускались «внутри» вкладок, поэтому вкладки остаются видимыми, и если пользователь нажимает на вкладку, она возвращается к исходному действию, определенному в функции setContent. Возможно ли это, и как я буду заниматься этим от других видов деятельности? (т.е. дочерние действия, а не те, которые определяют TabHost и имеют доступ к вызову setContent)?Запуск действий на вкладке в Android
ответ
Можно запустить действия в пределах вкладок. Поэтому установите содержимое tabspec в ActivityGroup вместо обычного Activity. .
tabHost.addTab(tabHost.newTabSpec("Tab")
.setIndicator("Tab")
.setContent(new Intent(this, YourActivityGROUP.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
Изнутри этого ActivityGroup вы можете начать другую активность, как это, что только обновляет contentview вкладки вы находитесь в
class YourActivityGROUP extends ActivityGroup{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//you van get the local activitymanager to start the new activity
View view = getLocalActivityManager()
.startActivity("ReferenceName", new
Intent(this,YourActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView();
this.setContentView(view);
}
}
commonsware.com является правильным, это невозможно. У меня была аналогичная проблема, но было всего лишь 1 деятельность. Я пожертвовал немного своей архитектурой и удалил активность, которая была запущена изнутри вкладки. Я поместил код в представление, а затем добавил ViewAnimator к активности вкладки. Я перепробовал кнопку «Назад» и удалял этот вид, если он поднят, или пусть кнопка «Назад» работает как обычно.
Это подделало это достаточно хорошо, и только для 1 тесно связанной деятельности я не собираюсь терять сон по соображениям дизайна.
Я решил с этим: Experience - Multiple Android Activities in a TabActivity
Здесь это мое решение
public class ActivityStack extends ActivityGroup {
private Stack<String> stack;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (stack == null) stack = new Stack<String>();
//start default activity
push("FirstStackActivity", new Intent(this, FirstStackActivity.class));
}
@Override
public void finishFromChild(Activity child) {
pop();
}
@Override
public void onBackPressed() {
pop();
}
public void push(String id, Intent intent) {
Window window = getLocalActivityManager().startActivity(id, intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
if (window != null) {
stack.push(id);
setContentView(window.getDecorView());
}
}
public void pop() {
if (stack.size() == 1) finish();
LocalActivityManager manager = getLocalActivityManager();
manager.destroyActivity(stack.pop(), true);
if (stack.size() > 0) {
Intent lastIntent = manager.getActivity(stack.peek()).getIntent();
Window newWindow = manager.startActivity(stack.peek(), lastIntent);
setContentView(newWindow.getDecorView());
}
}
}
Закладка запуска
Intent intent = new Intent().setClass(this, ActivityStack.class);
TabHost.TabSpec spec = tabHost.newTabSpec("tabId")
spec.setContent(intent);
вызовов следующая деятельность
public class FirstStackActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("First Stack Activity ");
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(getParent(), SecondStackActivity .class);
ActivityStack activityStack = (ActivityStack) getParent();
activityStack.push("SecondStackActivity", intent);
}
});
setContentView(textView);
}
}
вызова следующий раз
public class SecondStackActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("First Stack Activity ");
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(getParent(), ThirdStackActivity .class);
ActivityStack activityStack = (ActivityStack) getParent();
activityStack.push("ThirdStackActivity", intent);
}
});
setContentView(textView);
}
}
Работает на эмуляторе 2.2
Имейте в виду, что 'ActivityGroup' теперь устарел. – CommonsWare
Этот код работает должным образом. –
На самом деле, есть довольно большая ошибка - если вы начинаете с активности A, а затем выполняете операцию B, а затем завершаете() в действии A, то код выше фактически завершает активность B. –
Как насчет 2 TabBar в этой проблеме. Первая 1 является меню нижней TabBar, второй один является высшим TabBar, они отличаются активностью и XML
вы можете использовать
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
для каждого вида деятельности, установленный в качестве контента для TabSpec, и он будет создавать эту деятельность каждый раз, когда вы нажимаете на вкладку
Как я могу открыть фрагмент или действие со счетчика на панели инструментов?
import android.content.Intent; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log; import android.view.Menu;
import android.view.MenuItem; import android.view.View;
import android.widget.AdapterView; import android.widget.ArrayAdapter;
import android.widget.Spinner;
> public class MainActivity extends AppCompatActivity {
>
> @Override
> protected void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> setContentView(R.layout.activity_main);
>
> //Appbar
> Toolbar toolbar = (Toolbar) findViewById(R.id.appbar);
> setSupportActionBar(toolbar);
> getSupportActionBar().setDisplayShowTitleEnabled(false);
>
> //Appbar page filter
> Spinner cmbToolbar = (Spinner) findViewById(R.id.CmbToolbar);
>
> ArrayAdapter<String> adapter = new ArrayAdapter<>(
> getSupportActionBar().getThemedContext(),
> R.layout.appbar_filter_title,
> new String[]{"Opción 1 ", "Opción 2 ", "Opción 3 "});
>
> adapter.setDropDownViewResource(R.layout.appbar_filter_list);
>
> cmbToolbar.setAdapter(adapter);
>
> cmbToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
> @Override
> public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
> //... Acciones al seleccionar una opción de la lista
> Log.i("Toolbar 3", "Seleccionada opción " + position);
>
> Fragment f = null;
>
> switch(position) {
> case 0:
> f = Fragment2.newInstance();
> break;
>
> case 1:
> f = Fragment1.newInstance();
> break;
>
> }
> }
>
> @Override
> public void onNothingSelected(AdapterView<?> adapterView) {
> //... Acciones al no existir ningún elemento seleccionado
> }
> });
> }
>
> @Override
> public boolean onCreateOptionsMenu(Menu menu) {
> // Inflate the menu; this adds items to the action bar if it is present.
> getMenuInflater().inflate(R.menu.menu_main, menu);
> return true;
> }
>
> @Override
> public boolean onOptionsItemSelected(MenuItem item) {
> // Handle action bar item clicks here. The action bar will
> // automatically handle clicks on the Home/Up button, so long
> // as you specify a parent activity in AndroidManifest.xml.
> int position = item.getItemId();
>
> Fragment f = null;
>
> switch(position) {
> case 0:
> f = Fragment2.newInstance();
> break;
>
> case 1:
> f = Fragment1.newInstance();
> break;
>
> case 2:
> Intent intent = new Intent(getApplicationContext(), Fragment1.class);
> startActivity(intent);
> break;
>
> }
> return super.onOptionsItemSelected(item);
> }
>
>
> public Fragment getItem(int position) {
>
> Fragment f = null;
>
> switch(position) {
> case 0:
> f = Fragment2.newInstance();
> break;
>
> case 1:
> f = Fragment1.newInstance();
> break;
>
> case 2:
> Intent intent = new Intent(getApplicationContext(), Fragment1.class);
> startActivity(intent);
> break;
>
> }
>
> return f;
> } }
- 1. Несколько действий на одной вкладке
- 2. Фрагменты против действий для навигации на вкладке
- 3. Android: запуск действий diff в TabWidget
- 4. Запуск действий приложения Android в другом приложении
- 5. Запуск и завершение действий в Long Shift на Android
- 6. Android Запуск приложения из последних действий
- 7. Нижняя граница в панели действий отображается только на вкладке
- 8. Запуск Android MonkeyRunner для многозадачных действий
- 9. Кнопка на вкладке Android
- 10. Запуск нового процесса в указанной вкладке в Android
- 11. Запуск неизвестных действий от приложения android
- 12. Как добавить фрагмент на клик на вкладке «Панель действий»
- 13. Запуск Chrome Упакованные приложения на вкладке браузера
- 14. фрагмент из viewPager hidding позади на вкладке панели действий
- 15. Запуск метода на вкладке закрытия браузера или выходе браузера
- 16. Запуск случайных действий
- 17. Переменная на вкладке XPCOM на вкладке
- 18. Панель действий на Android
- 19. Запуск службы и действий в разных процессах в android
- 20. Панель действий не отображается во вкладке
- 21. Закладка прокрутки на вкладке Android
- 22. Android: используйте прядильщик на вкладке
- 23. Измените текст на вкладке Android
- 24. Как создать вкладку на вкладке в Android?
- 25. Выход приложения на двойной вкладке в android
- 26. Установите фоновое изображение на вкладке в android
- 27. Редактирование нижнего бара на вкладке в Android
- 28. Как удалить панель действий на вкладке Вид андроида
- 29. Почему текст не отображается на вкладке панели действий?
- 30. Как реализовать длинный щелчок на вкладке панели действий
спасибо за это ... на самом деле, я думаю, что это должен быть правильный способ продвижения вперед для реализации такого рода функций, поскольку он обеспечивает улучшенную эксплуатационную надежность кода. – samiq
Есть и другой способ, но элегантный? Не совсем ... Вы всегда можете сохранить экземпляр класса TabActivity в расширенном классе Application (чтобы избежать глобального статического).Когда вам нужно запустить новое действие, вы вызываете класс Application для возврата экземпляра TabActivity и запускаете метод, который очищает вкладки и воссоздает их, но заменяет текущую активность на новую. Если кто-то заинтересован, я могу подробнее рассказать. – glr
привет, спасибо .. я могу вызывать новую активность на той же вкладке, но проблема возникает, когда вы возвращаетесь к предыдущему действию. Я вызываю Activity B из ActivityGroup A, теперь я хочу снова перейти в ActivityGroup A .. Не могли бы вы дать мне подсказку .. спасибо .. –