2014-06-23 55 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

很樂意幫助你;) –