2010-12-20 1 views
1

J'ai une classe de dialogue personnalisée qui étend Dialog. A l'intérieur, j'ai un onglet avec 2 onglets. Dans chaque onglet, j'ai une vue en liste. Tout fonctionne, mais je ne peux pas afficher les barres de défilement.Android listview à l'intérieur de la disposition de l'onglet à l'intérieur de la boîte de dialogue ne peut pas afficher les barres de défilement

Voici mon 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> 

et fait partie de mon code ici qui définit cette place:

// 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

Je pense que vous demandez trop dans une boîte de dialogue. 2 onglets et 2 listes de lecture dans une boîte de dialogue? Vraiment? – Falmarri

+0

fonctionne très bien à l'exception de la question de la barre de défilement – Bob

Répondre

9

OK est le code de travail complet pour une classe de boîte de dialogue personnalisée qui contient une disposition à onglets contenant un listView. Le premier onglet a un listView avec des lignes étant un textView et un imageView avec l'imageView étant aligné à droite. Le second onglet a un listView avec des lignes étant un seul textView. Les barres de défilement sont définies sur une durée de fondu élevée pour qu'elles s'affichent toujours. La fenêtre de dialogue elle-même est définie sur une taille statique pour empêcher le redimensionnement de la boîte de dialogue lors du changement d'onglet. La fenêtre de dialogue est également positionnée plus bas sur l'écran, pas au centre. Les listViews utilisent des adaptateurs personnalisés et listView du second onglet est enregistré pour un menu contextuel. J'ai renommé tout pour être plus générique et j'ai des noms de nos produits, donc j'ai peut-être fait quelques fautes de frappe lors du changement de nom mais je pense que tout est correct. J'ai essayé de commenter le code du mieux que je pouvais. J'espère que cela aide certaines personnes.

Le XML customDialog (de 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> 

Onglet 1 listView XML ligne (list_view_01_row.xml). C'est un textView, aligné à gauche et un imageView, aligné à droite. TextView a été défini sur une hauteur plus grande afin de forcer les lignes listView à être plus élevées. Le listView a également été défini sur une largeur spécifique, ce qui pousse l'imageView vers la droite afin de l'aligner à droite.

<?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> 

Tab 2 listViewView XML (list_view_02_row.xml). Identique à l'onglet 1 mais avec un seul textView, aucun 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> 

Et enfin la classe de dialogue personnalisée.

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

Je sais que c'est vieux, mais j'ai dû ajouter mon +1: c'est incroyablement proche de ce que j'essaie de faire, alors vous m'avez sauvé des heures de travail - merci beaucoup! – Guillaume

3

Essayez de définir tous les android:layout_width attributs de votre mise en page XML à "fill_parent".

+0

l'a obtenu, il suffit de le définir pour TabHost et cela a fonctionné, a laissé tout le reste pareil. – Bob

+0

Bob, assurez-vous de poster votre réponse et marquez-la comme la réponse –

+0

encore pas encore entièrement résolu cependant. barres de défilement apparaissent, mais ils se cachent toujours même avec Android: scrollbarAlwaysDrawVerticalTrack = "true". – Bob

Questions connexes