我有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);
,它会抛出一个空错误!我试图在相同的布局中显示截图,它工作正常!但当我试图在&#34;截图&#34;布局它给了我这个错误。
还有一件事。当我创建截图时,它不会出现在工作室中,直到重新打开AVD!那是正常的吗?
感谢。
答案 0 :(得分:0)
NullPointerException肯定来自screenshotViewCtrl为null。
您在代码中将其初始化为: screenshotViewCtrl =(ImageView)findViewById(R.id.screenshotView);
因此,findViewById返回null。这意味着它无法找到具有该ID的视图。你没有发布你的onCreate()方法,而不是你的Activity_Main.xml,但我认为你正在膨胀你的两个布局中的一个,但试图找到另一个中定义的视图。你不能这样做,Android不会警告你:如果它找不到你想要的东西,它将只返回null。
如果您想从中访问视图,请确保您正在对您的screenshot.xml而不是Activity_Main.xml进行充气。
答案 1 :(得分:0)
感谢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
}