完整的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.getBroadcast
到PendingIntent clickPI=PendingIntent.getActivity
不会做任何事情无论是。
好吧,让我有一点的一种解决方法解决这个问题,将不得不做,直到我找到一个实际的解决方案。 这涉及运行,反过来启动我想目的的活动。 我最初想避免这种情况,但哦。
我的新代码,任何人都可能需要它:
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;
}
}
remoteViews.setOnClickPendingIntent(R.layout.callwidget_layout, clickPI);
你应该引用一个布局内的视图。 没有一个布局。
编辑:如果这是整个方法,你也缺少appWidgetmanager.updateWidgetAppWidget(...)
调用。
编辑2:您可以使用getBroadcast(...)
当你真正要广播消息的接收器。 对于调用活动,你需要getActivity(...)
使用ACTION_DIAL
,不ACTION_CALL
。
查看文档。 例如,在常见的意图先导,以获得对系统的意图,例如要求如何发起电话呼叫和上ACTION_CALL文件说:
注:上会有哪些应用程序可以发起呼叫限制; 大多数应用程序应该使用ACTION_DIAL 。
也:
...的Log.d方法工作,这表明小部件更新精...
成功Log.d()
表明代码到了那里(断点将是另一种方式来确定这一点),但它没有给出证据证明小部件得到了成功更新。 你有一个有用的假设存在,该部件得到了更新,问题是在这之后,如错误的意图。 以检验这一假设将让你更新发生明显变化的部件,如文本在TextView中的一种方式。