我是android开发的新手,我正在尝试从我的主类打开一个弹出窗口,该窗口是在另一个类上创建的。 问题是,当我尝试通过点击主要类的按钮来调用弹出窗口时,我收到以下错误:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
如果我将弹出的代码移动到按钮的情况下,我可以通过点击它打开,但我不能使用任何方法在其他类(至少我不知道如何)。 我经常搜索并找到一些类似的线程,但我尝试的所有内容都失败了,错误没有改变。
所以,我更喜欢在第二个类中使用popup的所有代码,只是从主类调用它,但如果我可以访问第二个类的方法,则不会打扰我。
以下是弹出窗口的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LayoutInflater inflater = (LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE);
//Inflate the view from a predefined XML layout
View layout = inflater.inflate(R.layout.keyboard,
(ViewGroup) findViewById(R.id.root));
// create a 300px width and 470px height PopupWindow
final PopupWindow pw = new PopupWindow(layout, 590, 400, true);
pw.setAnimationStyle(android.R.style.Animation_Dialog);
pw.setBackgroundDrawable(new BitmapDrawable());
pw.setOutsideTouchable(true);
// display the popup in the center
pw.showAtLocation(layout, Gravity.TOP, 0, 50);
主类按钮的代码:
case R.id.bkeyb:
startActivity(new Intent(this, keyboard.class));
break;
我决定将弹出的所有代码包含在主活动中并删除第二个类。 所以我创建了一个方法弹出窗口,其中包含上面的主类onCreate下的弹出窗口代码。我用按钮测试它,我想打开弹出窗口并工作。 然后我为弹出窗口的所有按钮创建了一个Initialise方法,其中使用findViewById作为资源和onClickListeners定义。
现在弹出的代码变为:
public void Popup(){
LayoutInflater inflater = (LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE);
//Inflate the view from a predefined XML layout
View layout = inflater.inflate(R.layout.keyboard,
(ViewGroup) findViewById(R.id.root));
initialize();
// create a 300px width and 470px height PopupWindow
final PopupWindow pw = new PopupWindow(layout, 590, 400, true);
pw.setAnimationStyle(android.R.style.Animation_Dialog);
pw.setBackgroundDrawable(new BitmapDrawable());
pw.setOutsideTouchable(true);
// display the popup in the center
pw.showAtLocation(layout, Gravity.TOP, 0, 50);
}
启动弹出窗口的按钮的onClickListener代码:
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.bkeyb:
Popup();
switch(v.getId()) {
case R.id.balpha:
tvcheck.setText("Α");
Log.e(null, "you pressed a");
break;
case R.id.bbeta:
tvcheck.setText("Β");
break;
}
break;
我刚刚添加了2个按钮进行测试。
现在按下按钮时,我遇到了 NullPointerException。的崩溃 所以又出了点问题。
答案 0 :(得分:1)
Android Framework定义了三种窗口类型。应用程序窗口,子窗口,系统窗口。弹出窗口属于子窗口,子窗口必须有父窗口。因此,您无法将弹出窗口设置为活动的主窗口。英文,希望您能理解我的意思!
答案 1 :(得分:0)
问题解决了。 我试图使用主要的onClickListener视图(这是我用于主类的按钮)并在开关盒内的开关中添加弹出按钮。这不起作用。 我需要为我制作的主Popup方法中的每个按钮包含onClickListener视图方法。也许有一种更加清晰和紧凑的方式,但这只对我有用。
工作代码是:
public void Popup(){
LayoutInflater inflater = (LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE);
//Inflate the view from a predefined XML layout
View layout = inflater.inflate(R.layout.keyboard,
(ViewGroup) findViewById(R.id.root));
// create a 300px width and 470px height PopupWindow
final PopupWindow pw = new PopupWindow(layout, 590, 400, true);
pw.update();
pw.setAnimationStyle(android.R.style.Animation_Dialog);
pw.setBackgroundDrawable(new BitmapDrawable());
pw.setOutsideTouchable(true);
// display the popup in the center
pw.showAtLocation(layout, Gravity.TOP, 0, 50);
balpha = (Button) pw.getContentView().findViewById(R.id.balpha);
balpha.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tvcheck.append("Α");
}
});
bbeta = (Button) pw.getContentView().findViewById(R.id.bbeta);
bbeta.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tvcheck.append("Β");
}
});
..........和另外20个按钮相同。
在主onClick视图上只调用Popup()方法:
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.bkeyb:
Popup();
tvcheck.setText("");
break;
.....还有一些按钮案例。