Запуск действий на вкладке в Android

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

Ответ 1

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

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

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

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

   }
}

Ответ 2

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

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

Ответ 4

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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