これは良い質問です。Android のソース コード (frameworks/base/core/java/android/view/View.java) を確認しました。
case com.android.internal.R.styleable.View_visibility:
final int visibility = a.getInt(attr, 0);
if (visibility != 0) {
viewFlagValues |= VISIBILITY_FLAGS[visibility]; //here is the key to your question
viewFlagMasks |= VISIBILITY_MASK;
}
break;
VISIBILITY_FLAGS の内容は次のとおりです。
private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};
配列要素の値は、実際にはAndroid リファレンスに示されている値です。
/**
* This view is visible.
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
* android:visibility}.
*/
public static final int VISIBLE = 0x00000000;
/**
* This view is invisible, but it still takes up space for layout purposes.
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
* android:visibility}.
*/
public static final int INVISIBLE = 0x00000004;
/**
* This view is invisible, and it doesn't take any space for layout
* purposes. Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
* android:visibility}.
*/
public static final int GONE = 0x00000008;
そのため、マニフェスト ファイルで android:invisible を使用しても、Android フレームワークは最終的に値 4 で setVisibility(...) を呼び出します。