2009-06-30 23 views
8

グリーティング、タブ上のOnClickListenerが機能しない

私のTabActivityの現在選択されているタブをクリックすると、Clickイベントを取得しようとしています。 onTabChangedHandlerは、タブが変更されたときにのみ呼び出され、現在アクティブなタブがクリックされている場合は呼び出されません。デバッガは、私のTabHost内にTabWidgetのために登録されたonClickListenerを持っていると伝えます。

間違った表示に登録していますか?

また、タブのコンテキストメニューを作成できません。その内容についてのみ、この問題は関係していますか?

public class TestDroidViewTab extends TabActivity 
           implements TabContentFactory 
           , OnTabChangeListener, OnClickListener { 

    private static final String LOG_KEY = "TEST"; 
    ListView listView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final TabHost tabHost = getTabHost(); 


     TabHost.TabSpec ts = tabHost.newTabSpec("ID_1"); 
     ts.setIndicator("1"); 
     ts.setContent(this); 
     tabHost.addTab(ts); 

     ts = tabHost.newTabSpec("ID_2"); 
     ts.setIndicator("2"); 
     ts.setContent(this); 
     tabHost.addTab(ts); 

     ts = tabHost.newTabSpec("ID_3"); 
     ts.setIndicator("3"); 
     ts.setContent(this); 
     tabHost.addTab(ts); 
     tabHost.setOnClickListener(this); 
     tabHost.setOnTabChangedListener(this); 
    } 
    public void onClick(View v) { 
     Log.d(LOG_KEY, "OnClick"); 
    } 

    public void onTabChanged(String tabId) { 
     Log.d(LOG_KEY, "OnTabChanged"); 
    } 

答えて

10

使用setOnTabChangedListener代わりのOnClickListener;)

static TabHost tabHost; 

    tabHost = getTabHost(); 


    tabHost.setOnTabChangedListener(new OnTabChangeListener() { 
     @Override 
     public void onTabChanged(String arg0) { 
     Log.i("******Clickin Tab number ... ", "" + tabHost.getCurrentTab()); 
     }  
}); 
+0

は、あなたが以前のようにタブの「クリック可能」を取得するためにスーパーメソッドを呼び出すことになっていませんか?これを試してみてくださいこのコードを追加すると、マウスが光りますが、このタブのlistActivityは表示されません。 –

+0

私の間違い申し訳ありませんが、爆弾のような作品、私はさらに下に引き継ぐ余分なコードを持っていた。 –

+0

私はコードに間違いがあると思う...ここでは、Tabhostの代わりにgetTabHost ..... –

19

あなたが特定のタブがクリックされたことを確認したい場合は、タブ自体ではなく、TabHostにリスナーを追加する必要があります。

タブ実装のビューの階層がある:

  • TabHost
    • TabWidget
      • (タブ)
      • (タブ)
    • でframeLayout
    • 個の

タブを呼び出すことにより、実行時に追加されます。tabHost.addTab(tabHost.newTabSpec(""));

あなたはその後、呼び出すことによって、個々のタブへのハンドルを取得することができます

:本質的にはgetTabWidget().getChildAt(4);

を、追加しているあなたのOnClickListenerへTabWidgetの子です。個々のタブのクリックを取得できるようになりました。ただし、これにより、タブがクリックされたときにコンテンツが変更されるデフォルトの動作が上書きされます。コンテンツを変更するには、OnClickListenerが必要です。ここで

を使用すると、クリックイベントをインターセプトし、タブの下の内容を変更することができた、完全な例です:

final String myTabTag = "My Tab"; 
final int myTabIndex = 3; 

getTabHost().addTab(getTabHost().newTabSpec(myTabTag)); 

getTabWidget().getChildAt(myTabIndex).setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (getTabHost().getCurrentTabTag().equals(myTabTag)) { 
      getTabHost().setCurrentTab(myTabIndex); 
     } 
    } 
}); 
+0

それは私のために働いて非常にマッシュアップありがとう... :) – praveenb

+0

これは私の目的のために働いた、ありがとう。 – CQM

+0

これを試してみると、タブは変更されますが、タブの下のコンテンツは表示されません。 –

2

あなたの句が間違っている、使用:

...

私のコードの中へ
if (getTabHost().getCurrentTabTag().equals(myTabTag) == false) { 
      getTabHost().setCurrentTab(myTabIndex); 
    } 

...

0

、I tはいくつかのエラーを示し、 レスポンスを待っている、getTabWidget()、getTabHost()などの名前の新しいメソッドを に作成するように求めています。

tabHost.getTabHost().setCurrentTab(myTabIndex); 
関連する問題