我的布局文件夹中有一个LinearLayout,名为“settings_caching_popup.xml”我尝试在onOptionsItemSelected(MenuItem item)
方法中显示此布局以显示弹出窗口。但是findViewById(R.layout.settings_caching_popup)
总是返回null。然后,我使用android:id="@+id/settings_caching_popup
将xml布局中的ID设置为LinearLayout,并调用findViewById(R.id.settings_caching_popup)
。返回也为null。
拉出onOptionsItemSelected(MenuItem item)
:
PopupWindow popUp = new PopupWindow(context);
LinearLayout ll = (LinearLayout) findViewById(R.layout.settings_caching_popup);
popUp.setContentView(ll);
popUp.showAtLocation(ll, Gravity.BOTTOM, 10, 10);
popUp.update(50, 50, 300, 80);
答案 0 :(得分:2)
您需要为要在弹出窗口中显示的布局进行充气。 findViewById()
仅返回已经夸大的视图。
试试这个:
final PopupWindow popUp = new PopupWindow(context);
LayoutInflater inflater = LayoutInflater.from(this);
final LinearLayout ll =
(LinearLayout)inflater.inflate(R.layout.settings_caching_popup, null);
popUp.setContentView(ll);
ll.post(new Runnable() {
public void run() {
popUp.showAtLocation(ll, Gravity.BOTTOM, 10, 10);
popUp.update(50, 50, 300, 80);
}
});
请注意,this
中的LayoutInflater.from(this);
必须是您的活动。因此,如果您想通过OnClickListener
或类似内容调用此内容,则需要将YourActivity.this
放在那里。
答案 1 :(得分:1)
在您查找的视图已从基础xml中膨胀之前,您无法使用findViewById
。我的猜测是,您正在寻找的视图需要先膨胀。视图的主要通胀通常发生在onCreate(...)
上,其中包含setContentView(...)
行。对于菜单,通货膨胀也发生在onCreateOptionsMenu(...)
,您可以在其中看到:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_menu, menu);
// findViewById will now work for views related to the options menu
}
对于非菜单的视图,请使用LAYOUT_INFLATER_SERVICE
,如下所示
inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.settings_caching_popup, null);
View childView = findViewById(R.id.childView); // view in R.layout.settings_caching_popup
如此处其他地方所述,请使用R.id.
中的findViewById
和使用inflater服务的R.layout.
。
答案 2 :(得分:1)
你正在使用:
LinearLayout ll = (LinearLayout) findViewById(R.layout.settings_caching_popup);
该方法是按 ID 查找查看,因此您应该通过它的ID获取
LinearLayout ll = (LinearLayout) findViewById(R.id.settings_caching_popup);
答案 3 :(得分:0)
使用
[parent view of settings_caching_popup].findViewById(R.id.settings_caching_popup);
而不是
findViewById(R.id.settings_caching_popup);
findViewById()
正在寻找在您调用setContentView()
(或类似内容)时为该活动夸大的布局中的视图