2015-07-01 17 views
2

我有一個listviewQuickContactBadge然後是聯繫人的名字。問題是徽章是方形的,如果聯繫人沒有圖像,那麼它只是空白。我希望有一個圓形圖片或者僅僅是想在運行Android Lollipop的聯繫人的首字母:用文字圓角的QuickContactBadge

Contacts

我試圖解決this的問題,但我無法得到它的工作。也許我剛剛實施它錯了?這是我有:

ContactsTab.java:

public class ContactsTab extends ListFragment implements LoaderCallbacks<Cursor> { 

    private CustomAdapter mAdapter; 
    private Cursor mCursor; 
    private String currentQuery; 
    private int mIdColumn; 
    private int mLookupKeyColumn; 
    private Uri mContactUri; 
    private QuickContactBadge mBadge; 
    private static final String[] PROJECTION = { 
      Contacts._ID, 
      Contacts.DISPLAY_NAME_PRIMARY, 
      Contacts.LOOKUP_KEY, 
      Contacts.PHOTO_THUMBNAIL_URI, 
      Contacts.HAS_PHONE_NUMBER, 
    }; 
    private static final String[] FROM = { Contacts.PHOTO_THUMBNAIL_URI, Contacts.DISPLAY_NAME_PRIMARY }; 
    private static final int[] TO = { R.id.badge, R.id.contact_text }; 
    private static final String SELECTION = "(" + Contacts.IN_VISIBLE_GROUP + " = 1) AND (" + Contacts.HAS_PHONE_NUMBER + " != 0)"; 


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

     mAdapter = new CustomAdapter(getActivity(), R.layout.contacts_list_item, null, FROM, TO, 0) 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setHasOptionsMenu(true); 
     setListAdapter(mAdapter); 
     getLoaderManager().initLoader(0, null, this); 
     getListView().setDivider(null); 
     getListView().setDividerHeight(0); 
    } 


    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     Uri contentUri = Contacts.CONTENT_URI; 

     return new CursorLoader(getActivity(), 
       contentUri, 
       PROJECTION, 
       SELECTION, 
       null, 
       Contacts.DISPLAY_NAME_PRIMARY + " ASC"); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     mAdapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     mAdapter.swapCursor(null); 
    } 
} 

CustomAdapter.java:

public class CustomAdapter extends SimpleCursorAdapter { 
    private Cursor _cursor; 
    private Context _context; 
    private String[] _from; 
    private int[] _to; 
    private QuickContactBadge badge; 
    private String lookUpKey; 

    public CustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
     _cursor = c; 
     _context = context; 
     _from = from; 
     _to = to; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     int id = cursor.getColumnIndex(ContactsContract.Data._ID); 

     lookUpKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)); 


     badge = (QuickContactBadge) view.findViewById(R.id.badge); 
     badge.assignContactUri(ContactsContract.Contacts.getLookupUri(id, lookUpKey)); 
     badge.setImageBitmap(generateCircleBitmap(R.color.accent, 42, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY.substring(0,1))); 
    } 

    public static Bitmap generateCircleBitmap(int circleColor, float diameterDP, String text){ 
     final int textColor = 0xffffffff; 

     DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 
     float diameterPixels = diameterDP * (metrics.densityDpi/160f); 
     float radiusPixels = diameterPixels/2; 

     // Create the bitmap 
     Bitmap output = Bitmap.createBitmap((int) diameterPixels, (int) diameterPixels, Bitmap.Config.ARGB_8888); 

     // Create the canvas to draw on 
     Canvas canvas = new Canvas(output); 
     canvas.drawARGB(0, 0, 0, 0); 

     // Draw the circle 
     final Paint paintC = new Paint(); 
     paintC.setAntiAlias(true); 
     paintC.setColor(circleColor); 
     canvas.drawCircle(radiusPixels, radiusPixels, radiusPixels, paintC); 

     // Draw the text 
     if (text != null && text.length() > 0) { 
      final Paint paintT = new Paint(); 
      paintT.setColor(textColor); 
      paintT.setAntiAlias(true); 
      paintT.setTextSize(radiusPixels * 2); 
      paintT.setTypeface(Typeface.SANS_SERIF); 
      final Rect textBounds = new Rect(); 
      paintT.getTextBounds(text, 0, text.length(), textBounds); 
      canvas.drawText(text, radiusPixels - textBounds.exactCenterX(), radiusPixels - textBounds.exactCenterY(), paintT); 
     } 

     return output; 
    } 
} 

回答

0

創建自定義繪製,你可以做到這一點

文件:可繪製/ contact_badge_round .xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> 

    <size android:width="32dp" android:height="32dp"/> 

    <gradient android:centerColor="#123456" 
       android:startColor="#123456" 
       android:endColor="#123456" 
     /> 

</shape> 

然後在您的佈局創建一個按鈕,並設置背景contact_badge_round

<Button 
     android:id="@+id/roundContact" 
     android:layout_width="32dp" 
     android:layout_height="32dp" 
     android:text="A" 
     android:gravity="center" 
     android:background="@drawable/background_new_entity_symbol" 
     /> 

做的歡呼聲!

+0

'QuickContactBadge'由xml中的聲明,但我仍然嘗試將'android:background'設置爲我的drawable,並將背景設置爲沒有縮略圖的聯繫人,但它沒有' crop the contacts contacts contacts contacts。。。另外我將如何設置文本? – yawers

+0

我試過同樣的我沒有找到解決方案。所以我嘗試了這種針對所有平臺的自定義方式。 –