【问题标题】:How to display QuickContact card from widget如何从小部件显示 QuickContact 卡片
【发布时间】:2011-02-05 07:20:37
【问题描述】:

我有一个小部件,可以显示我的一些联系人的图片,我想在用户点击其中一张图片时显示 QuickContact 卡片。我知道我应该使用 ContactsContract.QuickContact.showQuickContact() 方法,但它需要 View 或 Rect 作为输入参数之一。我的问题是小部件只有 RemoteViews,所以我不确定要传递什么作为 View 或 Rect 参数。任何想法将不胜感激。

【问题讨论】:

  • 您是否真的得到了在小部件中工作的公认答案?我看不到如何将 QuickContactBadge 添加到小部件。即使在 Android 2.2.1 上,我也会收到 W/AppWidgetHostView(20284): Error inflating AppWidget AppWidgetProviderInfo(provider=ComponentInfo{com.mypackage.xyz/com.com.mypackage.xyz.FeedsWidget}): android.view。 InflateException: Binary XML file line #131: Error inflating class androi d.widget.QuickContactBadge --- 因为它不是受支持的组件。

标签: android android-widget contacts


【解决方案1】:

要在小部件上显示 QuickContact UI,您可以使用此处说明的技术进行回调 PendingIntent:

http://advback.com/android/working-with-app-widgets-android/

在您的小部件 onUpdate() 中,创建意图并将其与 RemoteView 关联:

intent = new Intent(context, MyWidget.class);  
intent.setAction(ACTION_WIDGET_RECEIVER);  
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
intent.setData(uri);
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.my_widget_view, pendingIntent);

单击视图时,您将在小部件中收到 onReceive() 通知。使用 Intent.getSourceBounds() 检索矩形,并显示 QuickContact:

public void onReceive(Context context, Intent intent) {  
 if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {  
    Uri uri = intent.getData();
    if ( uri != null ) {
        QuickContact.showQuickContact(context, intent.getSourceBounds(), uri, ContactsContract.QuickContact.MODE_SMALL, null);
    }
 }  
 super.onReceive(context, intent);
}  

【讨论】:

    【解决方案2】:

    您可以在 XML 中引用徽章

    我在 XML 文件中有这个:

         <QuickContactBadge
         android:id="@+id/photo"
        android:layout_width="54dip"
        android:layout_height="57dip"
        android:layout_marginLeft="5dip"
        android:background="@drawable/quickcontact_photo_frame"
        style="?android:attr/quickContactBadgeStyleWindowSmall"
         />
    

    还有这段代码:

    private QuickContactBadge mPhotoView;
    mPhotoView = (QuickContactBadge) findViewById(R.id.photo);
    mPhotoView.assignContactUri(objItem.getUri());
    mPhotoView.setMode(QuickContact.MODE_MEDIUM);
    

    这是调用模式(但是点击徽章正在处理这个弹出窗口,这个调用也弹出选择器是通过点击其他东西来完成的)

    QuickContact.showQuickContact(viewContactQuick.this, mPhotoView,objItem.getLookupUri() , QuickContact.MODE_MEDIUM, null);
    

    【讨论】:

    • 但是如果您在小部件(家庭应用程序)上有多个 QuickContactBadge 会发生什么。您的“私有 QuickContactBadge mPhotoView”没有链接回 XML,那么您如何知道哪个 QuickContactBadge 属于私有声明?谢谢
    • 抱歉,少了一行mPhotoView = (QuickContactBadge) findViewById(R.id.photo);
    • 你上面的代码是在Activity中定义的吗?我问的原因是因为 findViewById() 没有在 AppWidgetProvider 中定义。如果是这种情况,那么您是否定义了一个 Intent 来打开该活动(当用户点击 QuickContactBade 时)然后您显示 QuickContact 卡片?
    • 我有一个活动。快速联系人卡片从两个对象打开。从徽章本身(它已经内置,我对点击事件没有反应),但我也想在点击联系人姓名时打开,我在上面提到的方式手动提升它。
    • 我也在调查这个。让我尝试一下:您实际上可以将 QuickContactBadge 作为 App Widget 放置吗?这就是我所需要的,但我不知道如何 a) 将联系人分配给徽章和 b) 通过 PendingIntent 显示 QuickContactCard。有什么提示吗?
    【解决方案3】:

    我也一直在寻找这个。也许联系人应用程序的来源会有所帮助。我正在尝试挖掘:link text

    【讨论】:

      【解决方案4】:

      我也为此苦苦挣扎了一段时间。查看 Android 源代码,Google 似乎制作了一个名为 QuickContactActivity 的透明活动,并将 QuickContactWindow(创建弹出窗口的类)放在其中。我尝试了同样的事情并且透明活动确实有效,但我无法让徽章出现。我知道 Qberticus 的 QuickActions 代码并且我确实尝试过,但我宁愿只使用 google 编写的快速联系人,因为复制它的功能和外观非常具有挑战性。

      当我尝试在 Eclair 上使用 QuickContact.showQuickContact() 方法时,我也遇到了 ActivityNotFoundException - 不过它在 Froyo 上效果很好。

      这是我的问题。如果我们能共同努力解决这个问题,那就太好了:link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        • 2021-11-22
        • 2022-07-20
        • 2018-11-23
        • 1970-01-01
        • 2022-09-22
        • 2011-06-06
        相关资源
        最近更新 更多