title: ImageView still visible after setVisibility(View.INVISIBLE)
body: <p>I am trying to make a camera app that shows an overlay when a picture is taken.
  When this overlay is shown the other UI components (except for the FrameLayout that shows the picture) should go invisible.
  But it seems that while my 2 imagebuttons go invisble, my imageview(ivCompass) doesn't.</p>
  
  <p>Here is the code that gets called when a picture is taken</p>
  
  <pre><code>Camera.PictureCallback mPicture = new Camera.PictureCallback() {
      @Override
      public void onPictureTaken(byte[] data, Camera camera) {
          //create a new intent...
          String path = createFile(data);
          intent = new Intent();
          intent.putExtra("path", path);
  
          mBearingProvider.updateBearing();
          bearing = mBearingProvider.getBearing();
          cardinalDirection = bearingToString(bearing);
          //((TextView) findViewById(R.id.tvPicDirection)).setText(cardinalDirection);
          Log.e("Direction", cardinalDirection + "," + bearing);
          findViewById(R.id.btnFlash).setVisibility(View.INVISIBLE);
          findViewById(R.id.btnCapture).setVisibility(View.INVISIBLE);
          findViewById(R.id.ivCompass).setVisibility(View.INVISIBLE);
          findViewById(R.id.pictureOverlay).setVisibility(View.VISIBLE);
      }
  };
  </code></pre>
  
  <p>And here is the layout file</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"&gt;
  
  &lt;FrameLayout
      android:id="@+id/camera_preview"
      android:layout_width="match_parent"
      android:layout_height="match_parent"&gt;
  &lt;/FrameLayout&gt;
  
  &lt;ImageButton
      android:id="@+id/btnFlash"
      android:layout_width="50dp"
      android:layout_height="50dp"
      android:layout_centerVertical="true"
      android:layout_margin="10dp"
      android:src="@drawable/camera_flash_on"
      android:background="@drawable/circle_flash"
      android:onClick="changeFlashMode"/&gt;
  
  &lt;ImageButton
      android:id="@+id/btnCapture"
      android:layout_width="50dp"
      android:layout_height="50dp"
      android:layout_alignParentRight="true"
      android:layout_centerVertical="true"
      android:layout_margin="10dp"
      android:src="@drawable/icon_camera"
      android:background="@drawable/circle_camera"/&gt;
  
  &lt;ImageView
      android:id="@+id/ivCompass"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:layout_alignParentRight="true"
      android:src="@drawable/camera_compass"
      android:background="@android:color/transparent"/&gt;
  
  &lt;RelativeLayout
      android:id="@+id/pictureOverlay"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_margin="20dp"
      android:background="@color/alphaBlack"
      android:visibility="invisible"&gt;
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <p></p>
  
  <p>I think It's just a mistake with naming, syntax or something like that, but I can't seem to find it.</p>
  
  <p><strong>EDIT:</strong></p>
  
  <p>Here is the entire Activity</p>
  
  <pre><code>public class CameraActivity extends AppCompatActivity implements BearingToNorthProvider.ChangeEventListener {
  
  private Camera mCamera;
  private CameraView mCameraView;
  private float mDist = 0f;
  private String flashMode;
  private ImageButton flashButton;
  private Intent intent;
  private BearingToNorthProvider mBearingProvider;
  private double bearing;
  private double currentBearing = 0d;
  private String cardinalDirection = "?";
  
  private final int REQUEST_CODE_ASK_PERMISSIONS = 2;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_camera);
      mCamera = getCameraInstance();
      mCameraView = new CameraView(this, mCamera);
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
      preview.addView(mCameraView);
      ImageButton captureButton = (ImageButton) findViewById(R.id.btnCapture);
      captureButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              Camera.Parameters params = mCamera.getParameters();
              params.setFlashMode(flashMode);
              mCamera.setParameters(params);
              mCamera.takePicture(null, null, mPicture);
          }
      });
      SharedPreferences sharedPref = this.getSharedPreferences(getString(R.string.apiKey), Context.MODE_PRIVATE);
      flashMode = sharedPref.getString(getString(R.string.flashMode), Camera.Parameters.FLASH_MODE_OFF);
      flashButton = (ImageButton) findViewById(R.id.btnFlash);
      setFlashButton();
      mBearingProvider = new BearingToNorthProvider(this,this);
      mBearingProvider.setChangeEventListener(this);
      mBearingProvider.start();
  }
  
  @Override
  protected void onPause() {
      super.onPause();
      mBearingProvider.stop();
  }
  
  /**
   * Helper method to access the camera returns null if it cannot get the
   * camera or does not exist
   *
   * @return the instance of the camera
   */
  private Camera getCameraInstance() {
      Camera camera = null;
      try {
          camera = Camera.open();
      } catch (Exception e) {
          Log.e("CamException", e.toString());
      }
      return camera;
  }
  
  Camera.PictureCallback mPicture = new Camera.PictureCallback() {
      @Override
      public void onPictureTaken(byte[] data, Camera camera) {
          //create a new intent...
          String path = createFile(data);
          intent = new Intent();
          intent.putExtra("path", path);
  
          mBearingProvider.updateBearing();
          bearing = mBearingProvider.getBearing();
          cardinalDirection = bearingToString(bearing);
          //((TextView) findViewById(R.id.tvPicDirection)).setText(cardinalDirection);
          Log.e("Direction", cardinalDirection + "," + bearing);
          findViewById(R.id.btnFlash).setVisibility(View.INVISIBLE);
          findViewById(R.id.btnCapture).setVisibility(View.INVISIBLE);
          findViewById(R.id.ivCompass).setVisibility(View.INVISIBLE);
          findViewById(R.id.pictureOverlay).setVisibility(View.VISIBLE);
      }
  };
  
  private void confirmPicture(View v) {
      /*String direction = String.valueOf(((TextView) findViewById(R.id.tvPicDirection)).getText());
      String description = String.valueOf(((EditText) findViewById(R.id.tvPicDescription)).getText());
      intent.putExtra("direction", direction);
      intent.putExtra("description", description);*/
  
      //close this Activity...
      setResult(Activity.RESULT_OK, intent);
      finish();
  }
  
  //region File Methods
  
  /**
   * Method that creates a file from the given byte array and saves the file in the Pictures Directory
   * @param data is the array of bytes that represent the picture taken by the camera
   * @return the path of created file
   */
  private String createFile(byte[] data){
      checkFilePermissions();
      File picFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + "tempPic.jpg" + File.separator);
      String path = picFile.getPath();
      try {
          BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(picFile));
          bos.write(data);
          bos.flush();
          bos.close();
          return path;
      } catch (IOException e) {
          e.printStackTrace();
          return "";
      }
  }
  
  /**
   * Checks the permission for reading to and writing from the external storage
   */
  private void checkFilePermissions() {
      if (android.os.Build.VERSION.SDK_INT &gt;= android.os.Build.VERSION_CODES.M) {
          int hasWriteExternalStoragePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
          if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED) {
              requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                      REQUEST_CODE_ASK_PERMISSIONS);
              return;
          }
      }
  }
  
  //endregion
  
  //region Zoom Methods
  
  @Override
  public boolean onTouchEvent(MotionEvent event) {
      // Get the pointer ID
      Camera.Parameters params = mCamera.getParameters();
      int action = event.getAction();
  
  
      if (event.getPointerCount() &gt; 1) {
          // handle multi-touch events
          if (action == MotionEvent.ACTION_POINTER_DOWN) {
              mDist = getFingerSpacing(event);
          } else if (action == MotionEvent.ACTION_MOVE &amp;&amp; params.isZoomSupported()) {
              mCamera.cancelAutoFocus();
              handleZoom(event, params);
          }
      } else {
          // handle single touch events
          if (action == MotionEvent.ACTION_UP) {
              handleFocus(event, params);
          }
      }
      return true;
  }
  
  private void handleZoom(MotionEvent event, Camera.Parameters params) {
      int maxZoom = params.getMaxZoom();
      int zoom = params.getZoom();
      float newDist = getFingerSpacing(event);
      if (newDist &gt; mDist) {
          //zoom in
          if (zoom &lt; maxZoom)
              zoom++;
      } else if (newDist &lt; mDist) {
          //zoom out
          if (zoom &gt; 0)
              zoom--;
      }
      mDist = newDist;
      params.setZoom(zoom);
      mCamera.setParameters(params);
  }
  
  public void handleFocus(MotionEvent event, Camera.Parameters params) {
      int pointerId = event.getPointerId(0);
      int pointerIndex = event.findPointerIndex(pointerId);
      // Get the pointer's current position
      float x = event.getX(pointerIndex);
      float y = event.getY(pointerIndex);
  
      List&lt;String&gt; supportedFocusModes = params.getSupportedFocusModes();
      if (supportedFocusModes != null &amp;&amp; supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
          mCamera.autoFocus(new Camera.AutoFocusCallback() {
              @Override
              public void onAutoFocus(boolean b, Camera camera) {
                  // currently set to auto-focus on single touch
              }
          });
      }
  }
  
  /** Determine the space between the first two fingers */
  private float getFingerSpacing(MotionEvent event) {
      double x = event.getX(0) - event.getX(1);
      double y = event.getY(0) - event.getY(1);
      return (float) Math.sqrt(x * x + y * y);
  }
  
  //endregion
  
  //region Flash Methods
  
  public void changeFlashMode(View v) {
      switch (flashMode) {
          case Camera.Parameters.FLASH_MODE_ON :
              flashMode = Camera.Parameters.FLASH_MODE_AUTO;
              break;
          case Camera.Parameters.FLASH_MODE_AUTO :
              flashMode = Camera.Parameters.FLASH_MODE_OFF;
              break;
          case Camera.Parameters.FLASH_MODE_OFF :
              flashMode = Camera.Parameters.FLASH_MODE_ON;;
              break;
      }
      SharedPreferences sharedPref = getSharedPreferences(getString(R.string.flashMode), Context.MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPref.edit();
      editor.putString(getString(R.string.flashMode), flashMode);
      editor.commit();
      setFlashButton();
  }
  
  public void setFlashButton() {
      switch (flashMode) {
          case Camera.Parameters.FLASH_MODE_ON :
              flashButton.setImageDrawable(getResources().getDrawable(R.drawable.camera_flash_on));
              break;
          case Camera.Parameters.FLASH_MODE_AUTO :
              flashButton.setImageDrawable(getResources().getDrawable(R.drawable.camera_flash_auto));
              break;
          case Camera.Parameters.FLASH_MODE_OFF :
              flashButton.setImageDrawable(getResources().getDrawable(R.drawable.camera_flash_off));
              break;
      }
  }
  
  //endregion
  
  //region Bearing Methods
  
  /**
   * Method that gives a cardinal direction based on the current bearing to the true north
   * @param bearing is the bearing to the true north
   * @return cardinal direction that belongs to the bearing
   */
  private String bearingToString(Double bearing) {
      String strHeading = "?";
      if (isBetween(bearing,-180.0,-157.5)) { strHeading = "South"; }
      else if (isBetween(bearing,-157.5,-112.5)) { strHeading = "SouthWest"; }
      else if (isBetween(bearing,-112.5,-67.5)) { strHeading = "West"; }
      else if (isBetween(bearing,-67.5,-22.5)) { strHeading = "NorthWest"; }
      else if (isBetween(bearing,-22.5,22.5)) { strHeading = "North"; }
      else if (isBetween(bearing,22.5,67.5)) { strHeading = "NorthEast"; }
      else if (isBetween(bearing,67.5,112.5)) { strHeading = "East"; }
      else if (isBetween(bearing,112.5,157.5)) { strHeading = "SouthEast"; }
      else if (isBetween(bearing,157.5,180.0)) { strHeading = "South"; }
      return strHeading;
  }
  
  /**
   * Method that checks if a certain number is in a certain range of numbers
   * @param x is the number to check
   * @param lower is the number that defines the lower boundary of the number range
   * @param upper is the number that defines the upper boundary of the number range
   * @return true if the number is between the other numbers, false otherwise
   */
  private boolean isBetween(double x, double lower, double upper) {
      return lower &lt;= x &amp;&amp; x &lt;= upper;
  }
  
  /*
  Method that triggers when the bearing changes, it sets the current bearing and sends an updated context to the provider
   */
  @Override
  public void onBearingChanged(double bearing) {
      this.bearing = bearing;
      mBearingProvider.setContext(this);
  
      ImageView image = (ImageView) findViewById(R.id.ivCompass);
  
      // create a rotation animation (reverse turn degree degrees)
      if (bearing &lt; 0) {
          bearing += 360;
      }
      RotateAnimation ra = new RotateAnimation((float)currentBearing,(float)-bearing, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF,0.5f);
  
      // how long the animation will take place
      ra.setDuration(210);
  
      // set the animation after the end of the reservation status
      ra.setFillAfter(true);
  
      // Start the animation
      image.startAnimation(ra);
      currentBearing = -bearing;
      mBearingProvider.setContext(this);
  }
  
  //endregion
  }
  </code></pre>
  
  <p><strong>EDIT 2:</strong></p>
  
  <p>I have made a small change to the onBearingChanged Method and now the compass is still visible, but thinks it's invisible and isn't moving because of my new if statement</p>
  
  <pre><code>@Override
  public void onBearingChanged(double bearing) {
      this.bearing = bearing;
      mBearingProvider.setContext(this);
  
      ImageView image = (ImageView) findViewById(R.id.ivCompass);
      if (image.getVisibility() == View.VISIBLE) {
  
          // create a rotation animation (reverse turn degree degrees)
          if (bearing &lt; 0) {
              bearing += 360;
          }
          RotateAnimation ra = new RotateAnimation((float) currentBearing, (float) -bearing, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  
          // how long the animation will take place
          ra.setDuration(210);
  
          // set the animation after the end of the reservation status
          ra.setFillAfter(true);
  
          // Start the animation
          image.startAnimation(ra);
          currentBearing = -bearing;
      }
      mBearingProvider.setContext(this);
  }
  </code></pre>