2014-06-23 51 views
4

当前使用的是Android 4.3设备。我使用的是优秀的答案provided here我能够减小AlertDialog的个别项目的字体大小:如何设置AlertDialog项目高度?

<style name="AlertDialogTheme" parent="android:Theme.Dialog"> 
    <item name="android:textSize">13sp</item> 
</style> 

对话本身内置有:

ContextThemeWrapper cw = new ContextThemeWrapper(this, R.style.AlertDialogTheme); 
AlertDialog.Builder builder = new AlertDialog.Builder(cw); 

然而,问题是即物品的单个高度仍保持不变 - 实际上,当您在对话框中滚动时,会显示第五个元素:

我试过setting the dividerHeight但这只是增加了间距。我也将layout_margin属性设置为0dp,但没有成功。

这个对话框的正确样式定义是什么,以减少标签之间的空间?

请注意,我不想使用视图再次构建整个对话框。我想保留现有的AlertDialog。

+0

您可能能够通过指定尺寸到Android属性'配置列表项的高度listPreferredItemHeight'(默认)或'listPreferredItemHeightSmall'(全息)在你的主题。 – corsair992

回答

6

这是一个棘手的解决方案 - 覆盖为ListViewgetView方法AlertDialog,改变TextView风格编程属性:

ContextThemeWrapper cw = new ContextThemeWrapper(MainActivity.this, R.style.AlertDialogTheme); 
AlertDialog.Builder builder = new AlertDialog.Builder(cw); 

AlertDialog dialog = builder.create(); 
dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
    @Override 
    public void onShow(DialogInterface dialogInterface) { 
     ListView listView = ((AlertDialog) dialogInterface).getListView(); 
     final ListAdapter originalAdapter = listView.getAdapter(); 

     listView.setAdapter(new ListAdapter() { 
      @Override 
      public int getCount() { 
       return originalAdapter.getCount(); 
      } 

      @Override 
      public Object getItem(int id) { 
       return originalAdapter.getItem(id); 
      } 

      @Override 
      public long getItemId(int id) { 
       return originalAdapter.getItemId(id); 
      } 

      @Override 
      public int getItemViewType(int id) { 
       return originalAdapter.getItemViewType(id); 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View view = originalAdapter.getView(position, convertView, parent); 
       TextView textView = (TextView) view; 
       //textView.setTextSize(16); set text size programmatically if needed 
       textView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 32 /* this is item height */)); 
       return view; 
      } 

      @Override 
      public int getViewTypeCount() { 
       return originalAdapter.getViewTypeCount(); 
      } 

      @Override 
      public boolean hasStableIds() { 
       return originalAdapter.hasStableIds(); 
      } 

      @Override 
      public boolean isEmpty() { 
       return originalAdapter.isEmpty(); 
      } 

      @Override 
      public void registerDataSetObserver(DataSetObserver observer) { 
       originalAdapter.registerDataSetObserver(observer); 

      } 

      @Override 
      public void unregisterDataSetObserver(DataSetObserver observer) { 
       originalAdapter.unregisterDataSetObserver(observer); 

      } 

      @Override 
      public boolean areAllItemsEnabled() { 
       return originalAdapter.areAllItemsEnabled(); 
      } 

      @Override 
      public boolean isEnabled(int position) { 
       return originalAdapter.isEnabled(position); 
      } 

     }); 
    } 
}); 

dialog.show(); 
+0

这很好,谢谢。很快就会奖励赏金。 – slhck

+0

很乐意帮助你;) –