android findViewById在onoptionsitemselected中返回null

时间:2013-06-12 14:56:51

标签: android findviewbyid

我的布局文件夹中有一个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);

4 个答案:

答案 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()(或类似内容)时为该活动夸大的布局中的视图