3

何らかの理由で、setCurrentTabは最初からタブを切り替えていません。これは私が使用するコードです。

private OnClickListener buttonListener = new OnClickListener(){

    @Override
    public void onClick(View v) {
        tabHost.setCurrentTab(Integer.parseInt((String) v.getTag()));

    }
};

表示するタブの数に等しいタグが付いたボタンに接続されています。ボタンを最初にクリックしてこのメ​​ソッドを呼び出すと、タブが表示されます。また、タブの内容を作成するコードを実行していることもわかります。

ただし、タブが一度表示されて別のタブに移動すると、クリックして戻っても機能しません。メソッドは確実に呼び出され、タグも正しいです。それを確認するために、ログに出力するコマンドを入力しました。また、それは最初のラウンドで動作するので大丈夫でなければなりません。

何か案が?

完全なコード:

public class TestTabs extends TabbedScreen implements TabHost.TabContentFactory{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initTabs();
    }

    @Override
    protected void initTabs() {

        addTab("0",this);
        addTab("1",this);
        addTab("2",this);
        addTab("3",this);

    }

    /*
     * 
     * @param extras The Bundle received in onCreate when this class is first created, and which contains the initial set of objects to be displayed.
     * @return An array containing all of the objects in the list.
     */
    protected Serializable[] getDataArray(Bundle extras) {
        int size = extras.size();
        Serializable[] data = new Serializable[size];
        for (int i = 0; i < size; i++) {
            data[i] = extras.getSerializable(Integer.toString(i));
        }

        return data;
    }

    @Override
    public View createTabContent(String tag) {


        // Get the data returned from the servelet and display it in the ListView
        Log.d("TestTabs","createTabContent");
         ListView lv = (ListView) findViewById(R.id.list_view);
         List<String> list1Strings = new ArrayList<String>();
         switch (Integer.parseInt(tag)){
            case 0:
                Log.d("TestTabs","Case 0");
                lv.setAdapter(new MyAdapter(this,lv,null));
                break;

            case 1:

                Log.d("TestTabs","Case 1");
                list1Strings.add("Item 21");
                list1Strings.add("Item 22");
                list1Strings.add("Item 23");
                list1Strings.add("Item 24");
                lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
                break;

            case 2:

                Log.d("TestTabs","Case 2");
                list1Strings.add("Item 31");
                list1Strings.add("Item 32");
                list1Strings.add("Item 33");
                list1Strings.add("Item 34");
                lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
                break;      

            case 3:

                Log.d("TestTabs","Case 3");
                list1Strings.add("Item 41");
                list1Strings.add("Item 42");
                list1Strings.add("Item 43");
                list1Strings.add("Item 44");
                lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
                break;      
        }

        return lv;
    }


    protected void addTab(String tabName, TabHost.TabContentFactory tabFactory){
        TabSpec tabSpec = tabHost.newTabSpec(tabName);
        tabSpec.setIndicator(tabName);                // Don't set tab layout since we are going to make it invisible
        tabSpec.setContent(tabFactory);
        tabHost.addTab(tabSpec);

        addButton(tabName);


    }

    protected void addButton(String tabName){
        Button button = (Button) buttonHolder.getChildAt(nextChild);
        button.setText(tabName);
        button.setVisibility(View.VISIBLE);
        button.setOnClickListener(buttonListener);
        nextChild--;
    }


    private OnClickListener buttonListener = new OnClickListener(){

        @Override
        public void onClick(View v) {
            v.setBackgroundResource(R.drawable.tab_selected);
            tabHost.setCurrentTab(Integer.parseInt((String) v.getTag()));
            Log.d("TabbedScreen","Set tab to " + v.getTag());
            View view;
            for (int i=0; i< childCount; i++)
                if ((view = buttonHolder.getChildAt(i)) != v){
                    view.setBackgroundResource(R.drawable.button_tab);
                    view.invalidate();
                }

        }
    };
}

XML:

       <?xml version="1.0" encoding="utf-8"?>


  <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:roundedListView="http://schemas.android.com/apk/res/com.applicat.meuchedet"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
       android:layout_below="@id/content_screen_user_details">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
            <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" 
                android:layout_height="wrap_content" android:visibility="gone"/>            
            <LinearLayout android:id="@+id/tabButtons" android:layout_width="wrap_content" android:layout_height="20dip">
                <Button android:layout_height="wrap_content" android:layout_width="0dip" 
                    android:layout_weight="1.0" android:id="@+id/button3" 
                    android:background="@drawable/button_tab" android:visibility="invisible"
                    android:tag="3"/>
                <Button android:layout_height="wrap_content" android:layout_width="0dip" 
                    android:layout_weight="1.0" android:id="@+id/button2" 
                    android:background="@drawable/button_tab" android:visibility="invisible"
                     android:tag="2"/>
                <Button android:layout_height="wrap_content" android:layout_width="0dip" 
                    android:layout_weight="1.0" android:id="@+id/button1" 
                    android:background="@drawable/button_tab" android:visibility="invisible"
                    android:tag="1"/>
                <Button android:layout_height="wrap_content" android:layout_width="0dip" 
                    android:layout_weight="1.0" android:id="@+id/button0" 
                    android:background="@drawable/tab_selected" android:visibility="invisible"
                    android:tag="0"/>
            </LinearLayout> 
        </FrameLayout>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        <com.applicat.meuchedet.views.RoundedListView
        android:id="@+id/list_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:paddingLeft="2dip" 
        android:paddingRight="2dip" 
        android:dividerHeight="1dip"
        android:footerDividersEnabled="true"
        android:listSelector="@drawable/listview_selected_item_background"
        android:fadingEdge="none"
        android:cacheColorHint = "#00000000"
        roundedListView:radius="20"
        roundedListView:border="2"
        />
        </FrameLayout>
    </LinearLayout>
</TabHost>

編集:

私は問題が列にあるかどうか疑問に思っていました:

ListView lv = (ListView) findViewById(R.id.list_view);

毎回同じオブジェクトを取り戻していますか?もしそうなら、FrameLayoutで定義されたものに基づいて毎回新しいものを取得するにはどうすればよいですか?

4

4 に答える 4

1

を使用するにはgetTag、最初に設定する必要があります。したがって、メソッドに次の行を追加するのを忘れたと思います。addButton

button.setTag(tabName);
于 2012-07-19T14:20:15.400 に答える
1

xmlのbuttonに割り当てられた値が、nextChild--のみで取得した値と同じであることをどのように確認できますか。

あまり良い解決策ではありません、あなたはそれをテストすることができます。

void addButton(String tabName){ 
Button button = (Button) buttonHolder.getChildAt(nextChild);
button.getTag() !=  String.valueOf(nextChild); ERROR;  

ただし、buttonHolder.getChildAt()で常に取得するものと同じに設定することをお勧めします。

    Button button = (Button) buttonHolder.getChildAt(nextChild);
    button.setTag(String.valueOf(nextChild));

変更:

protected void addButton(String tabName){
    Button button = (Button) buttonHolder.getChildAt(nextChild);
    // ----------- modified -----------
    button.setTag(String.valueOf(nextChild));
    button.setText(tabName);
    button.setVisibility(View.VISIBLE);
    button.setOnClickListener(buttonListener);
    nextChild--;
}


private OnClickListener buttonListener = new OnClickListener(){

    @Override
    public void onClick(View v) {
        v.setBackgroundResource(R.drawable.tab_selected);
        // ----------- modified -----------
        Button btc = (Button)v;
        int idx;
        try {
          idx = Integer.parseInt((String) btc.getTag());
            } catch(NumberFormatException exx) {
            System.out.println("Could not parse " + exx);
            } 
        if ( idx < childCount) {
           Log.d("TabbedScreen","Set tab to " + String.valueOf(idx);
           Button butv;
           for (int i=0; i< childCount; i++) 
            if ( i != idx){
            butv = (Button)  buttonHolder.getChildAt(i);    
            butv.setBackgroundResource(R.drawable.button_tab);
            butv.invalidate();
            }
           tabHost.setCurrentTab(idx);
           tabHost.focusCurrentTab(idx);
        }
        // ----------- modified ----------- 

    }
};

}

于 2012-07-29T21:42:20.250 に答える
0

これを使って

    ListView lv = getListView();

それ以外の

ListView lv = (ListView) findViewById(R.id.list_view);

このgetListView()メソッドは、「現在の」レイアウトに関連付けられたリストビューを返します。

また、これを機能させるには、xml内のリストビューのIDを次のように変更する必要があります。

<ListView
          android:id="@+android:id/list"
于 2012-07-27T05:04:43.573 に答える
0

getTag()が問題を引き起こしている可能性があります。戻り値を変数に格納して、値が正しいかどうかを確認します(実際には必要ない整数)??

于 2012-07-27T13:04:46.917 に答える