11

私のプロジェクトには、2 つのタブと 1 つのボタンがあります。2 つのタブには、2 つのアクティビティと、異なるアクティビティを呼び出すボタンがあります。問題は、最初のタブにボタンの結果を表示していることです。つまり、tab0 は、tab0Event とボタン クリック イベントでもアクティブです。そして、tabHost.setOnTabChangedListenerを使用してタブイベントを変更することができますが、さらに欲しいのは、ボタンをクリックするとボタンビューが表示されているとします(tab0がアクティブです)が、もう一度tab0をクリックすると、tab0アクティビティが表示されるはずです表示されます。

タブをクリックするための多くのソリューションを試しました.1つは

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

3 に答える 3

7

このリスナーを実装できます。

    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"));
于 2013-01-09T20:19:04.397 に答える
2

フラグメントを使用してレイアウトできます

于 2013-01-10T03:25:40.617 に答える
1

できません。TabWidgetのビューにはすでにonClickListenerがあり、通常のワークフローに必要です。これを削除すると、TabWidgetのロジックが壊れます。

onClickListenerを設定すると、以前のonClickListenerが削除され、TabWidgetロジックが壊れます。

通常、このような場合、複合クリックリスナーが作成されます(クリックイベントを処理し、別のクリックリスナーを呼び出すクリックリスナー)。ただし、ViewにはgetOnClickListenerメソッドがないため、古いクリックリスナーを取得する方法がないため、あなたの場合はそうではありません。

これはTabWidgetのソースコードです。関連するすべての値はプライベートです...したがって、こちら側からのanithingを修正することはできません。

目標を達成する唯一の方法は、プライベート変数を読み取ることができるため、Reflectionsを使用してハックすることです。したがって、Viewの新しいonlickリスナーを設定する前に、(Reflectionsを使用して)古いリスナーを取得し、イベント処理コードを実行する複合onClickListenerを作成してから、古いonClickListenerを呼び出す必要があります。複合クリックリスナーをビューに設定します。

于 2013-01-08T21:16:56.957 に答える