2010-12-20 5 views
1

私はDialogを拡張するカスタムダイアログクラスを持っています。この中には2つのタブを持つタブレイアウトがあります。各タブにはリストビューがあります。すべて動作しますが、スクロールバーが表示されません。ここでダイアログリスト内のタブレイアウト内のAndroidリストビューは表示するスクロールバーを取得できません

は私のXMLです:

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

<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/TabHost01" 
android:layout_width="300dp" 
android:layout_height="300dp"> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

    <ListView 
     android:id="@+id/ListView01" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" 
     android:scrollbarAlwaysDrawVerticalTrack="true"/> 

    <ListView 
     android:id="@+id/ListView02" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" 
     android:scrollbarAlwaysDrawVerticalTrack="true"/> 

    </FrameLayout> 
</LinearLayout> 
</TabHost> 

、ここではこれをセットアップする私のコードの一部です:

// get this window's layout parameters so we can change the position 
WindowManager.LayoutParams params = getWindow().getAttributes(); 

    // change the position. 0,0 is center 
    params.x = 0; 
    params.y = 250; 
    this.getWindow().setAttributes(params); 

    // no title on this dialog 
requestWindowFeature(Window.FEATURE_NO_TITLE); 

setContentView(R.layout.myLayout); 

// instantiate our list views for each tab 
ListView listView01 = (ListView)findViewById(R.id.ListView01); 
ListView listView02 = (ListView)findViewById(R.id.ListView02); 


// instantiate and set our custom list view adapters 
listViewAdapter01 = new ListViewAdapter01(context); 
listView01.setAdapter(listViewAdapter01); 

listViewAdapter02 = new ListViewAdapter02(context); 
listView02.setAdapter(listViewAdapter02); 

// get our tabHost from the xml 
TabHost tabs = (TabHost)findViewById(R.id.TabHost01); 
tabs.setup(); 

// create tab 1 
TabHost.TabSpec tab1 = tabs.newTabSpec("tab1"); 
tab1.setContent(R.id.listView01); 
tab1.setIndicator("List 1"); 
tabs.addTab(tab1); 

// create tab 2 
TabHost.TabSpec tab2 = tabs.newTabSpec("tab2"); 
tab2.setContent(R.id.listView02); 
tab2.setIndicator("List 01"); 
tabs.addTab(tab2); 
+1

私はあなたがダイアログボックスからあまりにも多くを求めていると思います。 2つのタブと2つのリストビューがダイアログにありますか?本当に? – Falmarri

+0

は、スクロールバーの問題 – Bob

答えて

9

ここでは、listViewを含むタブレイアウトを含むカスタムダイアログクラスの完全な作業コードです。最初のタブには、行がtextViewであるlistViewと、imageViewが右揃えであるimageViewがあります。 2番目のタブには、行が単一のtextViewであるlistViewがあります。スクロールバーは、常に表示されるように高いフェード時間に設定されています。ダイアログウィンドウ自体は静的サイズに設定されているため、タブを切り替えるときにダイアログのサイズが変更されません。ダイアログウィンドウは、画面中央ではなく下側に配置されています。 listViewsはカスタムアダプターを使用し、2番目のタブのlistViewはコンテキストメニュー用に登録されています。

名前を変更する際にいくつかのタイプミスをしている可能性がありますが、すべての名前をより一般的な名前に変更しています。できる限りコードをコメントしようとしました。これが一部の人々に役立つことを願っています

customDialogのXML(custom_dialog_layout.xml):

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

<TabHost 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/TabHost01" 
    android:layout_width="fill_parent" 
    android:layout_height="300dip"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"/> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

     <ListView 
      android:id="@+id/listView01" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scrollbars="vertical" 
      android:scrollbarFadeDuration="1000000"/> 

     <ListView 
      android:id="@+id/listView02" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scrollbars="vertical" 
      android:scrollbarFadeDuration="1000000"/> 

     </FrameLayout> 
    </LinearLayout> 
</TabHost> 

タブ1つのリストビュー列XML(list_view_01_row.xml)。これは、左揃えのtextViewと右揃えのimageViewです。 textViewは、listViewの行を強制的に高くするために、より大きな高さに設定されています。 listViewも特定の幅に設定されています。これにより、imageViewを右にプッシュして右揃えします。

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

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="5dip" 
    android:paddingTop="5dip" 
    android:paddingLeft="10dip" 
    android:paddingRight="10dip"> 

    <TableLayout 
     android:id="@+id/list_view_01_row_table_layout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:stretchColumns="0"> 

     <TableRow 
      android:id="@+id/list_view_01_row_table_row" 
      android:gravity="center_vertical" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

       <TextView 
        android:id="@+id/list_view_01_row_text_view" 
        android:textSize="18sp" 
        android:textColor="#ffffff" 
        android:gravity="center_vertical" 
        android:layout_width="200dip" 
        android:layout_height="75dip" /> 

       <ImageView 
        android:id="@+id/list_view_01_row_image_view" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 
     </TableRow> 
    </TableLayout> 
</LinearLayout> 

タブ2 listView row XML(list_view_02_row.xml)。タブ1と同じですが、textViewは1つで、imageViewはありません。

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

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="5dip" 
    android:paddingTop="5dip" 
    android:paddingLeft="10dip" 
    android:paddingRight="10dip"> 

    <TableLayout 
     android:id="@+id/list_view_02_row_table_layout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:stretchColumns="0"> 

     <TableRow 
      android:id="@+id/list_view_02_row_table_row" 
      android:gravity="center_vertical" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

      <TextView 
       android:id="@+id/list_view_02_row_text_view" 
       android:textSize="18sp" 
       android:textColor="#ffffff" 
       android:gravity="center_vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="75dip" /> 
     </TableRow> 
    </TableLayout> 
</LinearLayout> 

最後にカスタムDialogクラス。

import android.app.Dialog; 
import android.content.Context; 
import android.view.ContextMenu; 
import android.view.LayoutInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TabHost; 
import android.widget.TextView; 

/** 
* This is a custom dialog class that will hold a tab view with 2 tabs. 
* Tab 1 will be a list view. Tab 2 will be a list view. 
* 
*/ 
public class CustomDialog extends Dialog 
{ 
    /** 
    * Our custom list view adapter for tab 1 listView (listView01). 
    */ 
    ListView01Adapter listView01Adapter = null; 

    /** 
    * Our custom list view adapter for tab2 listView (listView02). 
    */ 
    ListView02Adapter listView02Adapter = null; 

    /** 
    * Default constructor. 
    * 
    * @param context 
    */ 
    public CustomDialog(Context context) 
    { 
     super(context); 

     // get this window's layout parameters so we can change the position 
     WindowManager.LayoutParams params = getWindow().getAttributes(); 

     // change the position. 0,0 is center 
     params.x = 0; 
     params.y = 250; 
     this.getWindow().setAttributes(params); 

     // no title on this dialog 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.custom_dialog_layout); 

     // instantiate our list views for each tab 
     ListView listView01 = (ListView)findViewById(R.id.listView01); 
     ListView listView02 = (ListView)findViewById(R.id.listView02); 

     // register a context menu for all our listView02 items 
     registerForContextMenu(listView02); 

     // instantiate and set our custom list view adapters 
     listView01Adapter = new ListView01Adapter(context); 
     listView01.setAdapter(listView01Adapter); 

     listView02Adapter = new ListView02Adapter(context); 
     listView02.setAdapter(listView02Adapter); 

     // bind a click listener to the listView01 list 
     listView01.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      public void onItemClick(AdapterView<?> parentView, View childView, int position, long id) 
      {     
       // will dismiss the dialog 
       dismiss(); 
      }   
     }); 

     // bind a click listener to the listView02 list 
     listView02.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      public void onItemClick(AdapterView<?> parentView, View childView, int position, long id) 
      {     
       // will dismiss the dialog 
       dismiss();   
      }   
     }); 

     // get our tabHost from the xml 
     TabHost tabs = (TabHost)findViewById(R.id.TabHost01); 
     tabs.setup(); 

     // create tab 1 
     TabHost.TabSpec tab1 = tabs.newTabSpec("tab1"); 
     tab1.setContent(R.id.listView01); 
     tab1.setIndicator("List 1"); 
     tabs.addTab(tab1); 

     // create tab 2 
     TabHost.TabSpec tab2 = tabs.newTabSpec("tab2"); 
     tab2.setContent(R.id.listView02); 
     tab2.setIndicator("List 2"); 
     tabs.addTab(tab2); 
    } 

    /** 
    * A custom list adapter for the listView01 
    */ 
    private class ListView01Adapter extends BaseAdapter 
    {   
     public ListView01Adapter(Context context) 
     { 

     } 

     /** 
     * This is used to return how many rows are in the list view 
     */ 
     public int getCount() 
     { 
      // add code here to determine how many results we have, hard coded for now 

      return 10; 
     } 

     /** 
     * Should return whatever object represents one row in the 
     * list. 
     */ 
     public Object getItem(int position) 
     { 
      return position; 
     } 

     /** 
     * Used to return the id of any custom data object. 
     */ 
     public long getItemId(int position) 
     { 
      return position; 
     } 

     /** 
     * This is used to define each row in the list view. 
     */ 
     public View getView(int position, View convertView, ViewGroup parent) 
     {    
      View row = convertView; 

      // our custom holder will represent the view on each row. See class below. 
      ListView01Holder holder = null; 

      if(row == null) 
      {             
       LayoutInflater inflater = getLayoutInflater(); 

       // inflate our row from xml 
       row = inflater.inflate(R.layout.list_view_01_row, parent, false); 

       // instantiate our holder 
       holder = new ListView01Holder(row); 

       // set our holder to the row 
       row.setTag(holder); 
      } 
      else 
      { 
       holder = (ListView01Holder)row.getTag(); 
      } 

      return row; 
     } 

     // our custom holder 
     class ListView01Holder 
     { 
      // text view 
      private TextView text = null; 

      // image view 
      private ImageView image = null; 

      ListView01Holder(View row) 
      {  
       // get out text view from xml 
       text = (TextView)row.findViewById(R.id.image); 

       // add code here to set the text 
       text.setText(""); 

       // get our image view from xml 
       image = (ImageView)row.findViewById(R.id.list_view_01_row_image_view); 

       // add code here to determine which image to load, hard coded for now 
       rating.setImageResource(R.drawable.image); 
      } 
     } 
    } 

    /** 
    * A custom list adapter for listView02 
    */ 
    private class ListView02Adapter extends BaseAdapter 
    {   
     public ListView02Adapter(Context context) 
     { 

     } 

     /** 
     * This is used to return how many rows are in the list view 
     */ 
     public int getCount() 
     { 
      // add code here to determine how many results we have, hard coded for now 

      return 5; 
     } 

     /** 
     * Should return whatever object represents one row in the 
     * list. 
     */ 
     public Object getItem(int position) 
     { 
      return position; 
     } 

     /** 
     * Used to return the id of any custom data object. 
     */ 
     public long getItemId(int position) 
     { 
      return position; 
     } 

     /** 
     * This is used to define each row in the list view. 
     */ 
     public View getView(int position, View convertView, ViewGroup parent) 
     {    
      View row = convertView; 
      ListView02Holder holder = null; 

      if(row == null) 
      {             
       LayoutInflater inflater = getLayoutInflater(); 

       row=inflater.inflate(R.layout.list_view_02_row, parent, false); 
       holder = new ListView02Holder(row); 
       row.setTag(holder); 
      } 
      else 
      { 
       holder = (ListView02Holder)row.getTag(); 
      } 

      return row; 
     } 

     class ListView02Holder 
     { 
      private TextView text = null; 

      ListView02Holder(View row) 
      { 
       text = (TextView)row.findViewById(R.id.list_view_02_row_text_view); 
       text.setText(""); 
      } 
     } 
    } 

    /** 
    * This is called when a long press occurs on our listView02 items. 
    */ 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) 
    { 
     super.onCreateContextMenu(menu, v, menuInfo); 

     menu.setHeaderTitle("Context Menu"); 
     menu.add(0, v.getId(), 0, "Delete"); 
    } 

    /** 
    * This is called when an item in our context menu is clicked. 
    */ 
    public boolean onContextItemSelected(MenuItem item) 
    { 
     if(item.getTitle() == "Delete") 
     { 

     } 
     else 
     { 
      return false; 
     } 

     return true; 
    } 
} 
+0

私はそれが古いことを知っていますが、私は+1を追加しなければなりませんでした。それは私がやろうとしていることに驚くほど近いので、時間を節約できました。 – Guillaume

3

"fill_parent"にあなたのレイアウトXML内android:layout_widthすべての属性を設定してください。

+0

を除いて、TabHost用に設定していなければうまくいきました。 – Bob

+0

ボブ、あなたの答えを投稿して、まだ答えが –

+0

であるとまだマークしていないことを確認してください。スクロールバーが表示されますが、アンドロイド:scrollbarAlwaysDrawVerticalTrack = "true"を指定しても自動的に非表示になります。 – Bob

関連する問題