0

「settings_caching_popup.xml」というレイアウト フォルダーに LinearLayout がありますonOptionsItemSelected(MenuItem item)。ポップアップを表示するメソッドでこのレイアウトを取得しようとしました。ただし、findViewById(R.layout.settings_caching_popup)常に null を返します。次に、xml レイアウトの ID を LinearLayout に設定し、android:id="@+id/settings_caching_popupを呼び出し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

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

あなたの活動thisでなければならないことに注意してください。したがって、これをや類似LayoutInflater.from(this);のものから呼び出したい場合は、そこに配置する必要があります。OnClickListenerYourActivity.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.findViewByIdR.layout.

于 2013-06-12T15:16:21.963 に答える
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 に答える