当我尝试在另一个布局中更改 ImageView 时,setImageBitmap 抛出空错误
setImageBitmap throw null error when i try to change ImageView in another layout
我有 2 个布局 Activity_Main
和 screenshot
。我想从 Activity_Main
截屏并显示在 screenshot
在onCreate
这个方法中:
public void bind (){
screenshotViewCtrl = (ImageView) findViewById(R.id.screenshotView);
rl = (RelativeLayout) findViewById(R.id.rl) ;}
这里是截屏显示的方法screenshot
public void save() {
View rootView = rl.getRootView(); //Activity_Main
rootView.setDrawingCacheEnabled(true);
Bitmap bitmap =Bitmap.createBitmap(rootView.getDrawingCache());
rootView.setDrawingCacheEnabled(false);
String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File myDir = new File(root + "/me");
myDir.mkdirs();
final Dialog savePicDialog = new Dialog(MainActivity.this);
savePicDialog.setTitle("edit name");
savePicDialog.setContentView(R.layout.screenshot);
EditText imgNameTxt = (EditText) savePicDialog.findViewById(R.id.txtPicName);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmm");
String dateString = sdf.format(date);
imgNameTxt.setText(dateString);
String name = imgNameTxt.getText().toString();
file = new File(myDir, name + ".png");
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, ostream);
ostream.flush();
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
String filePath = file.getPath();
Bitmap selectedBitmap = BitmapFactory.decodeFile(filePath);
screenshotViewCtrl.setImageBitmap(selectedBitmap);
Button saveBtn = (Button) savePicDialog.findViewById(R.id.btnSave);
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newGame();
savePicDialog.cancel();
}
});
Button deleteBtn = (Button) savePicDialog.findViewById(R.id.btnDelete);
deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
file.delete();
savePicDialog.cancel();
}
});
savePicDialog.show();}
screenshot
的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"
android:id="@+id/l1">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/screenshotView"
android:layout_gravity="center_horizontal"/>
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:id="@+id/txtPicName"
android:layout_gravity="center_horizontal" />
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Save"
android:id="@+id/btnSave"
android:layout_gravity="center_horizontal" />
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Delete"
android:id="@+id/btnDelete"
android:layout_gravity="center_horizontal" />
</LinearLayout>
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="alzahrani.alaa.myapp" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
问题出在screenshotViewCtrl.setImageBitmap(selectedBitmap);
它抛出一个空错误!我尝试以相同的布局显示屏幕截图并且效果很好!但是当我尝试在 "screenshot" 布局中显示它时,它给了我这个错误。
还有一件事。当我创建屏幕截图时,它不会出现在工作室中,直到重新打开 AVD!那是正常的吗?
谢谢。
你的NullPointerException肯定是因为screenshotViewCtrl为null引起的。
您在代码中通过以下方式对其进行了初始化:
screenshotViewCtrl = (ImageView) findViewById(R.id.screenshotView);
因此,findViewById return为空。这意味着它找不到具有该 ID 的视图。你没有 post 你的 onCreate() 方法,而不是你的 Activity_Main.xml,但我认为你正在膨胀你的两个布局之一,但试图找到另一个中定义的视图。你不能那样做,Android 也不会警告你:如果它找不到你要找的东西,它只会 return null。
如果您想从 Activity_Main.xml 中查看视图,请确保给 screenshot.xml 充气,而不是 Activity_Main.xml。
感谢 zsolt.kocsi。这是编辑后的代码:
public void save() {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View scrnShotLayout = inflater.inflate(R.layout.screenshot, null);
screenshotViewCtrl = (ImageView) scrnShotLayout.findViewById(R.id.screenshotView);
...//same old
savePicDialog.setContentView(menuLayout);
...//same
}
我有 2 个布局 Activity_Main
和 screenshot
。我想从 Activity_Main
截屏并显示在 screenshot
在onCreate
这个方法中:
public void bind (){
screenshotViewCtrl = (ImageView) findViewById(R.id.screenshotView);
rl = (RelativeLayout) findViewById(R.id.rl) ;}
这里是截屏显示的方法screenshot
public void save() {
View rootView = rl.getRootView(); //Activity_Main
rootView.setDrawingCacheEnabled(true);
Bitmap bitmap =Bitmap.createBitmap(rootView.getDrawingCache());
rootView.setDrawingCacheEnabled(false);
String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File myDir = new File(root + "/me");
myDir.mkdirs();
final Dialog savePicDialog = new Dialog(MainActivity.this);
savePicDialog.setTitle("edit name");
savePicDialog.setContentView(R.layout.screenshot);
EditText imgNameTxt = (EditText) savePicDialog.findViewById(R.id.txtPicName);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmm");
String dateString = sdf.format(date);
imgNameTxt.setText(dateString);
String name = imgNameTxt.getText().toString();
file = new File(myDir, name + ".png");
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, ostream);
ostream.flush();
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
String filePath = file.getPath();
Bitmap selectedBitmap = BitmapFactory.decodeFile(filePath);
screenshotViewCtrl.setImageBitmap(selectedBitmap);
Button saveBtn = (Button) savePicDialog.findViewById(R.id.btnSave);
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newGame();
savePicDialog.cancel();
}
});
Button deleteBtn = (Button) savePicDialog.findViewById(R.id.btnDelete);
deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
file.delete();
savePicDialog.cancel();
}
});
savePicDialog.show();}
screenshot
的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"
android:id="@+id/l1">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/screenshotView"
android:layout_gravity="center_horizontal"/>
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:id="@+id/txtPicName"
android:layout_gravity="center_horizontal" />
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Save"
android:id="@+id/btnSave"
android:layout_gravity="center_horizontal" />
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Delete"
android:id="@+id/btnDelete"
android:layout_gravity="center_horizontal" />
</LinearLayout>
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="alzahrani.alaa.myapp" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
问题出在screenshotViewCtrl.setImageBitmap(selectedBitmap);
它抛出一个空错误!我尝试以相同的布局显示屏幕截图并且效果很好!但是当我尝试在 "screenshot" 布局中显示它时,它给了我这个错误。
还有一件事。当我创建屏幕截图时,它不会出现在工作室中,直到重新打开 AVD!那是正常的吗?
谢谢。
你的NullPointerException肯定是因为screenshotViewCtrl为null引起的。
您在代码中通过以下方式对其进行了初始化: screenshotViewCtrl = (ImageView) findViewById(R.id.screenshotView);
因此,findViewById return为空。这意味着它找不到具有该 ID 的视图。你没有 post 你的 onCreate() 方法,而不是你的 Activity_Main.xml,但我认为你正在膨胀你的两个布局之一,但试图找到另一个中定义的视图。你不能那样做,Android 也不会警告你:如果它找不到你要找的东西,它只会 return null。
如果您想从 Activity_Main.xml 中查看视图,请确保给 screenshot.xml 充气,而不是 Activity_Main.xml。
感谢 zsolt.kocsi。这是编辑后的代码:
public void save() {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View scrnShotLayout = inflater.inflate(R.layout.screenshot, null);
screenshotViewCtrl = (ImageView) scrnShotLayout.findViewById(R.id.screenshotView);
...//same old
savePicDialog.setContentView(menuLayout);
...//same
}