0

我的布局文件夹中有一个 LinearLayout,名为“settings_caching_popup.xml”,我试图在onOptionsItemSelected(MenuItem item)显示弹出窗口的方法中使用此布局。但findViewById(R.layout.settings_caching_popup)总是返回 null。然后我在 xml 布局中将一个 ID 设置为 LinearLayoutandroid:id="@+id/settings_caching_popup并调用findViewById(R.id.settings_caching_popup). 返回也为空。

拉出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);
4

4 回答 4

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);
    }
});

请注意,这必须是您的活动thisLayoutInflater.from(this);所以,如果你想从一个OnClickListener或类似的地方调用它,你需要把它放在YourActivity.this那里。

于 2013-06-12T15:13:47.297 回答
1

findViewById在您要查找的视图从基础 xml 中膨胀之前,您无法使用。我的猜测是,您正在寻找的视图需要先膨胀。视图的主要膨胀通常发生在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和使用。R.layout.

于 2013-06-12T15:16:21.963 回答
1

您正在使用:

LinearLayout ll = (LinearLayout) findViewById(R.layout.settings_caching_popup);

该方法是 Find View by ID,所以你应该通过它的 ID 来获取它

LinearLayout ll = (LinearLayout) findViewById(R.id.settings_caching_popup);
于 2013-06-12T16:24:46.627 回答
0

利用

[parent view of settings_caching_popup].findViewById(R.id.settings_caching_popup);

代替

findViewById(R.id.settings_caching_popup);

findViewById()正在寻找在您调用setContentView()(或类似的东西)时为活动膨胀的布局中的视图

于 2013-06-12T15:12:29.360 回答