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

时间:2015-01-23 02:43:14

标签: java android nullpointerexception screenshot

我有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);,它会抛出一个空错误!我试图在相同的布局中显示截图,它工作正常!但当我试图在&#34;截图&#34;布局它给了我这个错误。 还有一件事。当我创建截图时,它不会出现在工作室中,直到重新打开AVD!那是正常的吗?

感谢。

2 个答案:

答案 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
   }