0

イメージ ビューをリニア レイアウトに動的に追加しようとするたびに、ヌル ポインター例外が発生します。

LinearLayout tables = (LinearLayout) findViewById(R.id.table);

        for(int i = 0; i < data.length; i++){
            ImageView image = new ImageView(getApplicationContext());
            try{
                int imgID = getResources().getIdentifier(data[i], "drawable", "package");
                image.setImageResource(imgID);

            }catch(Exception e){
                int imgID = getResources().getIdentifier("nia", "drawable", "package");
                image.setImageResource(imgID);
            }               
            tables.addView(image); //NULL POINTER THROWN HERE
        }

デバッグすると、imgID に値が含まれているので、その動作がわかりました。null の理由がわかりません

4

2 に答える 2

3

XML レイアウトに問題があるかどうかを確認するには、プログラムでレイアウトを定義してみてください。

        LinearLayout tables = new LinearLayout(getApplicationContext());

        for(int i = 0; i < data.length; i++){
            ImageView image = new ImageView(getApplicationContext());
            try{
                int imgID = getResources().getIdentifier(data[i], "drawable", "package");
                image.setImageResource(imgID);

            }catch(Exception e){
                int imgID = getResources().getIdentifier("nia", "drawable", "package");
                image.setImageResource(imgID);
            }               
            tables.addView(image); 
        }

そして、このビューを ContentView のように追加します

        setContentView(tables);
于 2012-07-10T20:41:24.233 に答える
3

これが Null Pointer Exception の原因となっている行である場合:

tables.addView(image);

次にnull です。単に findViewById() が、表示されている現在のレイアウトでtablesid を持つビューを見つけられませんでした。R.id.table

(なぜtablesnullなのかを理解するのに助けが必要な場合は、に渡すレイアウトを投稿してくださいsetContentView())

コメントから追加

PopupWindow を作成する一般的な方法を次に示します。これは LayoutInflator を使用してレイアウトをインフレートし、それにアクセスして要素をレイアウトに動的に追加できるようにします。(find のスコープを に設定していることに注意してくださいpopupLayout.findViewById(...)):

public class Example extends Activity {
    private PopupWindow popupWindow;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView text = (TextView) findViewById(R.id.text);
        text.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                createPopup(view);
            }
        });
    }

    public void createPopup(View view) {
        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
        View popupLayout = layoutInflater.inflate(R.layout.popup, null);  
        // Customize popup's layout here

        Button dismissButton = (Button) popupLayout.findViewById(R.id.dismiss);
        dismissButton.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                popupWindow.dismiss();
            }
        });

        popupWindow = new PopupWindow(popupLayout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
    }
}

popup.xmlのルート要素には属性が定義されている必要があることを理解してください。定義されてbackgroundいない場合、ウィンドウはデフォルトで透明になります。

于 2012-07-10T20:01:51.613 に答える