Widget和setOnClickPendingIntent(Widgets and setOnCl

2019-10-18 07:21发布

完整的Android开发新手在这里,予以警告。

我试图建立一个主屏幕小部件,让您挖掘插件调用预设号码。 我可以创建窗口小部件并将其添加到主屏幕就好了,但是,当我试图让小部件可点击使用setOnClickPendingIntent ,没有启动的活动。 我使用的代码如下规定:

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
          int[] appWidgetIds) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
              R.layout.callwidget_layout);
    Log.d("stuff", "remoteview defined");
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    Log.d("stuff", "intent created");
    callIntent.setData(Uri.parse("tel:"+8888888));
    Log.d("stuff", "intent data added");
    PendingIntent clickPI=PendingIntent
            .getBroadcast(context, 0,
                          callIntent,
                          PendingIntent.FLAG_UPDATE_CURRENT);
    Log.d("stuff", "pending intent created");

    remoteViews.setOnClickPendingIntent(R.layout.callwidget_layout, clickPI);
    Log.d("stuff", "setonclickpendingintent created");

}

Log.d方法做工精细,因为他们出现在logcat的输出,但敲击控件什么都不做。 有迹象表明,出现在logcat的没有其他错误消息。 有什么我做错了吗?

UPDATE:改变了setOnClickPendingIntent引用与ID“callbutton”的按钮( remoteViews.setOnClickPendingIntent(R.id.callbutton, clickPI); ),并且还试图将这些三行代码到的onUpdate方法:

ComponentName myWidget = new ComponentName(context, WidgetProvider.class);
appWidgetManager.getInstance(context).updateAppWidget(myWidget, remoteViews);
Log.d("stuff", "widget updated");

同样, Log.d方法有效,这表明小部件更新罚款,但轻点按钮仍然不能做任何事情。

更新2:更改PendingIntent clickPI=PendingIntent.getBroadcastPendingIntent clickPI=PendingIntent.getActivity不会做任何事情无论是。

Answer 1:

好吧,让我有一点的一种解决方法解决这个问题,将不得不做,直到我找到一个实际的解决方案。 这涉及运行,反过来启动我想目的的活动。 我最初想避免这种情况,但哦。

我的新代码,任何人都可能需要它:

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
          int[] appWidgetIds) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
              R.layout.callwidget_layout);
    Log.d("stuff", "remoteview defined");
    Intent callIntent = new Intent(context, CallActivity.class);
    PendingIntent clickPI=PendingIntent
            .getActivity(context, 0,
                          callIntent,
                          PendingIntent.FLAG_UPDATE_CURRENT);
    Log.d("stuff", "pending intent created");

    remoteViews.setOnClickPendingIntent(R.id.callbutton, clickPI);
    Log.d("stuff", "setonclickpendingintent created");
    ComponentName myWidget = new ComponentName(context, WidgetProvider.class);
    appWidgetManager.getInstance(context).updateAppWidget(myWidget, remoteViews);
    Log.d("stuff", "widget updated");

}

CallActivity.java:

package com.example.callzepolice;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class CallActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_call);
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        Log.d("stuff", "intent created");
        callIntent.setData(Uri.parse("tel:"+8888888));
        Log.d("stuff", "intent data added");
        startActivity(callIntent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.call, menu);
        return true;
    }

}


Answer 2:

remoteViews.setOnClickPendingIntent(R.layout.callwidget_layout, clickPI);

你应该引用一个布局内的视图。 没有一个布局。

编辑:如果这是整个方法,你也缺少appWidgetmanager.updateWidgetAppWidget(...)调用。

编辑2:您可以使用getBroadcast(...)当你真正要广播消息的接收器。 对于调用活动,你需要getActivity(...)



Answer 3:

使用ACTION_DIAL ,不ACTION_CALL

查看文档。 例如,在常见的意图先导,以获得对系统的意图,例如要求如何发起电话呼叫和上ACTION_CALL文件说:

注:上会有哪些应用程序可以发起呼叫限制; 大多数应用程序应该使用ACTION_DIAL 。

也:

...的Log.d方法工作,这表明小部件更新精...

成功Log.d()表明代码到了那里(断点将是另一种方式来确定这一点),但它没有给出证据证明小部件得到了成功更新。 你有一个有用的假设存在,该部件得到了更新,问题是在这之后,如错误的意图。 以检验这一假设将让你更新发生明显变化的部件,如文本在TextView中的一种方式。



文章来源: Widgets and setOnClickPendingIntent