2013-06-21 35 views
0

我知道这里有很多类似的问题,但我无法将答案传递给我的问题(或者我没有找到我需要的答案...)BadTokenException无法在PopUpWindow中添加窗口微调器

在我的actionBar菜单中(onOptionsItemSelected)我打开一个popupWindow用户设置。复选框,单选按钮做工精细,但如果在微调我标签,会出现一个严重异常:

FATAL EXCEPTION: main 
android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 

这是onOptionsItemSelected方法的代码:

LayoutInflater inflaterSettings = LayoutInflater.from(context); 
final LinearLayout llSettings = (LinearLayout) inflaterSettings.inflate(R.layout.actionbar_menu_settings_popup, null); 
Spinner spinner = (Spinner) llSettings .findViewById(R.id.spinner_action_settings_intervall_values); 
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_settings_intervall_values, android.R.layout.simple_spinner_item); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinner.setAdapter(adapter); 
spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id){ TODO} 
    @Override 
    public void onNothingSelected(AdapterView<?> parent) { // TODO } 
}); 
PopupWindow popUp = new PopupWindow(context); 
popUp.setContentView(llSettings); 
llSettings.post(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     popUp.showAtLocation(llSettings, Gravity.CENTER, 0, 0); 
     int width = getResources().getDisplayMetrics().widthPixels; 
     int height = getResources().getDisplayMetrics().heightPixels; 
     width = (int) (width * 0.9); 
     height = (int) (height * 0.9); 
     popUp.update(width, height); 
    } 
}); 

我actionbar_menu_settings_popup.xml:

<Spinner 
    android:id="@+id/spinner_action_settings_intervall_values" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:drawSelectorOnTop="true" 
    android:entries="@array/action_settings_intervall_values" /> 

和string.xml:

<string-array name="action_settings_intervall_values"> 
    <item>5</item> 
    <item>15</item> 
    <item>30</item> 
    <item>45</item> 
    <item>60</item> 
    <item>120</item> 
    <item>180</item> 
</string-array> 

编辑

做了一个登录onOptionsItemSelected

Log.i("MainActivity#onCreateOptionsItems", "context: " + context); 
Log.i("MainActivity#onCreateOptionsItems", "getApplicationContext: " + getApplicationContext()); 
Log.i("MainActivity#onCreateOptionsItems", "this: " + this); 

结果:

06-21 10:40:58.185: I/MainActivity#onCreateOptionsItems(14463): context: [email protected] 
06-21 10:40:58.185: I/MainActivity#onCreateOptionsItems(14463): getApplicationContext: [email protected] 
06-21 10:40:58.185: I/MainActivity#onCreateOptionsItems(14463): this: [email protected] 
+0

你在哪里分配上下文? 'onCreate'中的 –

+0

我做了'context = this;' – lis

+0

你的弹出窗口没有与窗口管理器连接。 – Atrix1987

回答

1

替换行

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_settings_intervall_values, android.R.layout.simple_spinner_item); 

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.action_settings_intervall_values, android.R.layout.simple_spinner_item); 

发生这种情况主要是因为上下文引用不正确。

+1

没有工作,同样的错误:( – lis

+0

你需要通过适当的上下文。你通过上下文(this/context)..replace this->上下文或反之亦然。这个问题就解决了, –

+0

测试了所有版本,把调试的不同选项,看看编辑部分,不要误解我:我知道错误的上下文可能是一个问题,但我不知道它是否在这里。不知道,我能做什么.. – lis

相关问题