当我尝试在另一个布局中更改 ImageView 时,setImageBitmap 抛出空错误

setImageBitmap throw null error when i try to change ImageView in another layout

我有 2 个布局 Activity_Mainscreenshot。我想从 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
   }