Как вызвать вкладку Onclick и OnTabChange для одной вкладки

В моем проекте у меня есть две вкладки и кнопка. Для двух вкладок у меня есть два действия и кнопка, вызывающая различную активность. Дело в том, что я показываю результат кнопки на первой вкладке. i.e 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, изменение вкладок не работает, и я получил очень неожиданные результаты. Не могли бы вы предложить решение для моей проблемы.

Спасибо.

код, который работает для измененной вкладки, выглядит следующим образом: (отлично работает для изменения вкладок, нужно добавить Tab 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);
                 }
            });               
      }
}

Ответ 1

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

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

Также, когда вы добавляете теги set tab для каждой вкладки:

host.addTab(host.newTabSpec("tab0"));
host.addTab(host.newTabSpec("tab1"));

Ответ 2

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

Ответ 3

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

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

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

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

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