我正在处理像whatsapp这样的聊天应用程序,我正在锁定屏幕上进行弹出通知。我开发了代码,但问题是 - 我在对话框上使用了两个按钮,如whatsapp作为关闭和视图,但按钮上的onclick监听器不起作用,因为对话框没有焦点,每当我点击任何地方的背景对话框点击屏幕执行点击。我需要这种类型的对话和功能,如 -
但对话没有得到焦点或问题是别的,我无法明确地得到它请帮助。
要实现这一点,我正在使用以下服务 -
public class PopupService extends Service{
@Override
public IBinder onBind(Intent intent) {
Utils.printLog("on bind");
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Utils.printLog("on start command");
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
mWakeLock.acquire();
mWakeLock.release();
///////////////////////////////////
final WindowManager mWindowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
final View mView = inflater.inflate(R.layout.dialog_popup_notification_received, null);
Utils.printLog("view" + mView.isClickable());
mView.setClickable(true);
mView.setFocusable(true);
mView.setFocusableInTouchMode(true);
mView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Utils.printLog("view" + mView.isClickable());
}
});
TextView tvMessage = (TextView) mView.findViewById(R.id.TextViewMessageInPopupMessageReceived);
tvMessage.setText(intent.getStringExtra("msg"));
ImageButton ibSend = (ImageButton) mView.findViewById(R.id.imageButtonSendInPopupMessageReceived);
TextView tvClose = (TextView) mView.findViewById(R.id.TextViewCloseInPopupMessageReceived);
TextView tvView = (TextView) mView.findViewById(R.id.textviewViewInPopupMessageReceived);
ibSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0)
{
Utils.printLog("send");
}
});
tvClose.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0)
{
Utils.printLog("close");
}
});
tvView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0)
{
Utils.printLog("view");
}
});
WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
/* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
PixelFormat.RGBA_8888);
mWindowManager.addView(mView, mLayoutParams);
mWindowManager.updateViewLayout(mView, mLayoutParams);
return super.onStartCommand(intent, flags, startId);
}
}
答案 0 :(得分:7)
我今天得到了解决方案..
这里是我的代码......
public class PopupService extends Service{
private static final String TAG = PopupService.class.getSimpleName();
WindowManager mWindowManager;
View mView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
showDialog(intent.getStringExtra("msg"));
return super.onStartCommand(intent, flags, startId);
}
private void showDialog(String aTitle)
{
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
mWakeLock.acquire();
mWakeLock.release();
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mView = View.inflate(getApplicationContext(), R.layout.dialog_popup_notification_received, null);
mView.setTag(TAG);
int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels / 2;
LinearLayout dialog = (LinearLayout) mView.findViewById(R.id.pop_exit);
// if you want to set params
// android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) dialog.getLayoutParams();
// lp.topMargin = top;
// lp.bottomMargin = top;
// mView.setLayoutParams(lp);
final EditText etMassage = (EditText) mView.findViewById(R.id.editTextInPopupMessageReceived);
ImageButton imageButtonSend = (ImageButton) mView.findViewById(R.id.imageButtonSendInPopupMessageReceived);
// lp = (LayoutParams) imageButton.getLayoutParams();
// lp.topMargin = top - 58;
// imageButton.setLayoutParams(lp);
imageButtonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Utils.printLog("clicked");
// mView.setVisibility(View.INVISIBLE);
if(!etMassage.getText().toString().equals(""))
{
Utils.printLog("sent");
etMassage.setText("");
}
}
});
TextView close = (TextView) mView.findViewById(R.id.TextViewCloseInPopupMessageReceived);
close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
hideDialog();
}
});
TextView view = (TextView) mView.findViewById(R.id.textviewViewInPopupMessageReceived);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
hideDialog();
}
});
TextView message = (TextView) mView.findViewById(R.id.TextViewMessageInPopupMessageReceived);
message.setText(aTitle);
final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,
PixelFormat.RGBA_8888);
mView.setVisibility(View.VISIBLE);
mWindowManager.addView(mView, mLayoutParams);
mWindowManager.updateViewLayout(mView, mLayoutParams);
}
private void hideDialog(){
if(mView != null && mWindowManager != null){
mWindowManager.removeView(mView);
mView = null;
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
它对我有用。
我在link;
获得了解决方案答案 1 :(得分:1)
您可以使用actvity而不是Dialog。也可以使用主题作为对话框。它可能有用。