Как вызвать вкладку Onclick и OnTabChange для одной вкладки - PullRequest
11 голосов
/ 29 ноября 2011

В моем проекте у меня есть две вкладки и кнопка.Для двух вкладок у меня есть два действия и кнопка вызова различных действий.Дело в том, что я показываю результат кнопки на первой вкладке.т.е. tab0 активен на tab0Event и на событие нажатия кнопки тоже.И я могу изменить события вкладки, используя tabHost.setOnTabChangedListener, но теперь я хочу, скажем, нажать кнопку, чтобы теперь отображался вид кнопки (tab0 активен), но снова, если я нажимаю tab0, активность tab0 должна бытьОтображается.

Я пробовал много решений для нажатия на вкладку, одно из них

getTabWidget().getChildAt(getTabHost().getCurrentTab()).setOnClickListener
      (new View.OnClickListener() {

      @Override public void onClick(View v) {
      System.out.println(getTabHost().getCurrentTab());

      } });

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

Спасибо.

код, который работает для изменения вкладки, выглядит так: (работает нормально для изменения вкладки, нужно добавить вкладку Onclick в нем)

public class TabLayoutUsingTabChangeEventActivity extends TabActivity {

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);                
            final TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
            final TabHost.TabSpec sp1 = tabHost.newTabSpec("TAB1");
            TabHost.TabSpec sp2 = tabHost.newTabSpec("TAB2");

            //Creating First Tab
            Intent intent1 = new Intent(this, Tab1Activity.class);
            sp1.setIndicator("TAB1").setContent(intent1);
            tabHost.addTab(sp1);

            //Creating Second Tab 
            Intent intent2 = new Intent(this, Tab2Activity.class);
            sp2.setIndicator("TAB2").setContent(intent2);
            tabHost.addTab(sp2);               

            //Tab Changed Event
            tabHost.setOnTabChangedListener(new OnTabChangeListener(){
                 @Override
                 public void onTabChanged(String tabId) {
                     Log.i("TabId :", tabId);
                     if(tabId.equals("TAB2")){
                     Log.i("TAB1", "TAB1 Changed");
                     Intent intent1 = new Intent().setClass(getApplicationContext(), Tab1Activity.class);
                     sp1.setIndicator("TAB1").setContent(intent1);
                     tabHost.setCurrentTab(0);
                     }
                  }
            });

            Button addNewButton = (Button)findViewById(R.id.add_new_ticket_btn);
            addNewButton.setOnClickListener(new OnClickListener(){
                  @Override
                  public void onClick(View v) {
                     Intent in = new Intent().setClass(getApplicationContext(), AddNewTicketActivity.class);
                     sp1.setContent(in);
                     tabHost.setCurrentTab(0);
                     //startActivity(in);
                 }
            });               
      }
}

Ответы [ 3 ]

7 голосов
/ 10 января 2013

Вы можете реализовать этот слушатель:

    host.setOnTabChangedListener(new OnTabChangeListener()
    {
        @Override
        public void onTabChanged(String tabId)
        {
            if (getTabHost().getCurrentTabTag().equals("tab0"))
            {
                host.getCurrentTabView().setOnTouchListener(
                        new OnTouchListener()
                        {
                            @Override
                            public boolean onTouch(View v, MotionEvent event)
                            {
                                if (event.getAction() == MotionEvent.ACTION_DOWN)
                                {
                                    if (getTabHost().getCurrentTabTag().equals("tab0")
                                    {
                                        getTabHost().setCurrentTabByTag("tab1");
                                        getTabHost().setCurrentTabByTag("tab0");
                                    }
                                    return false;
                                }
                                return false;
                            }
                        });
            }
        }
    });

Также при добавлении вкладок установите тег для каждой вкладки:

host.addTab(host.newTabSpec("tab0"));
host.addTab(host.newTabSpec("tab1"));
2 голосов
/ 10 января 2013

Вы можете использовать Фрагмент для макета

1 голос
/ 09 января 2013

Ты не можешь. Представления в TabWidget уже имеют onClickListener, и это требуется для нормального рабочего процесса. Если вы удалите его, вы нарушите логику TabWidget.

Когда вы устанавливаете свой onClickListener, вы удаляете предыдущие свойства onClickListener и нарушаете логику TabWidget.

Обычно в таких случаях создается прослушиватель сложных щелчков (прослушиватель щелчков, который обрабатывает событие щелчка и вызывает другого прослушивателя щелчков). Но не в вашем случае, потому что нет способа получить старый прослушиватель кликов, потому что у View нет метода getOnClickListener.

Это исходный код TabWidget. Все связанные значения являются частными ... поэтому мы не можем исправить anithing с этой стороны.

Единственный способ достичь вашей цели - взломать Reflections, потому что он позволяет читать приватные переменные. Поэтому, прежде чем устанавливать новый onlick слушатель View, вы должны получить старый (используя Reflections), затем создать составной onClickListener, который будет выполнять ваш код обработки событий, а затем вызвать старый onClickListener. Установите составной слушатель щелчка на Представление.

...