2009-08-20 4 views
33

Вот сделка. У меня есть приложение с тремя вкладками. Благодаря различным взаимодействиям с элементами на вкладках я запускаю другие действия. Клиент просмотрел это и хотел бы, чтобы действия запускались «внутри» вкладок, поэтому вкладки остаются видимыми, и если пользователь нажимает на вкладку, она возвращается к исходному действию, определенному в функции setContent. Возможно ли это, и как я буду заниматься этим от других видов деятельности? (т.е. дочерние действия, а не те, которые определяют TabHost и имеют доступ к вызову setContent)?Запуск действий на вкладке в Android

ответ

44

Можно запустить действия в пределах вкладок. Поэтому установите содержимое 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); 

    } 
} 
+1

спасибо за это ... на самом деле, я думаю, что это должен быть правильный способ продвижения вперед для реализации такого рода функций, поскольку он обеспечивает улучшенную эксплуатационную надежность кода. – samiq

+0

Есть и другой способ, но элегантный? Не совсем ... Вы всегда можете сохранить экземпляр класса TabActivity в расширенном классе Application (чтобы избежать глобального статического).Когда вам нужно запустить новое действие, вы вызываете класс Application для возврата экземпляра TabActivity и запускаете метод, который очищает вкладки и воссоздает их, но заменяет текущую активность на новую. Если кто-то заинтересован, я могу подробнее рассказать. – glr

+0

привет, спасибо .. я могу вызывать новую активность на той же вкладке, но проблема возникает, когда вы возвращаетесь к предыдущему действию. Я вызываю Activity B из ActivityGroup A, теперь я хочу снова перейти в ActivityGroup A .. Не могли бы вы дать мне подсказку .. спасибо .. –

0

commonsware.com является правильным, это невозможно. У меня была аналогичная проблема, но было всего лишь 1 деятельность. Я пожертвовал немного своей архитектурой и удалил активность, которая была запущена изнутри вкладки. Я поместил код в представление, а затем добавил ViewAnimator к активности вкладки. Я перепробовал кнопку «Назад» и удалял этот вид, если он поднят, или пусть кнопка «Назад» работает как обычно.

Это подделало это достаточно хорошо, и только для 1 тесно связанной деятельности я не собираюсь терять сон по соображениям дизайна.

11

Здесь это мое решение

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

+1

Имейте в виду, что 'ActivityGroup' теперь устарел. – CommonsWare

+0

Этот код работает должным образом. –

+0

На самом деле, есть довольно большая ошибка - если вы начинаете с активности A, а затем выполняете операцию B, а затем завершаете() в действии A, то код выше фактически завершает активность B. –

0

Как насчет 2 TabBar в этой проблеме. Первая 1 является меню нижней TabBar, второй один является высшим TabBar, они отличаются активностью и XML

1

вы можете использовать

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

для каждого вида деятельности, установленный в качестве контента для TabSpec, и он будет создавать эту деятельность каждый раз, когда вы нажимаете на вкладку

0

Как я могу открыть фрагмент или действие со счетчика на панели инструментов?

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; 
>  } } 
Смежные вопросы