Запуск действий на вкладке в Android - PullRequest
33 голосов
/ 20 августа 2009

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

Ответы [ 7 ]

44 голосов
/ 02 июня 2010

Можно запускать действия на вкладках . Поэтому задайте для содержимого tabspec группу ActivityGroup вместо обычной Activity.

tabHost.addTab(tabHost.newTabSpec("Tab")
                .setIndicator("Tab")
                .setContent(new Intent(this, YourActivityGROUP.class)
                 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

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

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

   }
}
11 голосов
/ 16 июня 2011

Вот мое решение

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

3 голосов
/ 23 декабря 2010
1 голос
/ 04 апреля 2012

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

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

0 голосов
/ 03 октября 2015

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

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;
>     } }
0 голосов
/ 07 февраля 2012

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

0 голосов
/ 24 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...