我想要实现以下功能:一旦用户单击一个按钮,将当前布局(主要)更改为另一个,另一个布局加载了一个图像。但我不断收到错误消息说“虚方法'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>
修改:
如果您遇到类似问题,请检查以下答案
答案 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);
然后这可以开始一个新的布局