onCreate中初始化的imageview但仍为null

时间:2017-04-02 20:05:50

标签: android

我想要实现以下功能:一旦用户单击一个按钮,将当前布局(主要)更改为另一个,另一个布局加载了一个图像。但我不断收到错误消息说“虚方法'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)'对空对象引用”。以下是我的mainactivity.java和'另一个layout'.xml

public class MainActivity extends AppCompatActivity {


    private Button mybtn;
    private ImageView myimage;

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

    public void init(){

        myimage = (ImageView) findViewById(R.id.imgview);
        mybtn = (Button) findViewById(R.id.btn);
        mybtn.setOnClickListener(new MyListener());
    }

    public class MyListener implements View.OnClickListener {

        @Override
        public void onClick(View v){
            switch (v.getId()){

                case R.id.btn:
                    setContentView(R.layout.the_other_layout);
                    initMap();
            }
        }
    }

    public void initMap(){

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;
        Bitmap bmp = null;
        bmp = BitmapFactory.decodeResource(getResources(),R.drawable.somepngfile,options);
        myimage.setImageBitmap(bmp);
    }
}

下面是the_other_layout xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imgview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        />

</LinearLayout>

修改

如果您遇到类似问题,请检查以下答案

4 个答案:

答案 0 :(得分:1)

问题出在这里:

case R.id.btn:
          setContentView(R.layout.the_other_layout);
          initMap();

删除它:

setContentView(R.layout.the_other_layout);

您无法在活动中设置两个布局。

修改

对于全屏图像查看:

 public void initMap(){
       myimage.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
       myimage.setImageDrawable(R.drawable.your_image);
       myimage.setScaleType(ImageView.ScaleType.FIT_XY);
   }

答案 1 :(得分:1)

原因是myimage不是activity_main.xml的一部分 所以你需要在setContentView(....)

之后移动它
public class MainActivity extends AppCompatActivity {


private Button mybtn;
private ImageView myimage;

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

public void init(){

    mybtn = (Button) findViewById(R.id.btn);
    mybtn.setOnClickListener(new MyListener());
}

public class MyListener implements View.OnClickListener {

    @Override
    public void onClick(View v){
        switch (v.getId()){

            case R.id.btn:
                setContentView(R.layout.the_other_layout);
                myimage = (ImageView) findViewById(R.id.imgview);
                initMap();
        }
    }
}

public void initMap(){

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;
    Bitmap bmp = null;
    ......
}

}

答案 2 :(得分:0)

问题出在您的initMap()方法中。您没有使用布局myimage的{​​{1}} ID ImageView重新初始化android:id="@+id/imgview"

更新the_other_layout.xml,如下所示:

initMap()

希望这会有所帮助〜

答案 3 :(得分:0)

我想出了另一种满足我要求的方法:添加新意图

Intent intent = new Intent(MainActivity.super.getBaseContext(), Myanotherclass.class);
startActivity(intent);

然后这可以开始一个新的布局