処理中を示すビューをつくる(Android)

何か時間のかかる処理をしたり, 処理をしている最中UI を触らせないようにするために, 少し暗くした

Viewなんかを追加して, 「触れないよ」ということを示したりするためのViewを作ります。

(ダイアログとかはではデフォルトでありますが…)。

今回の成果物はこちらです
black

これは, 単純に暗くなったViewを重ねたものです。通常のレイアウトに, 追加レイアウトのViewを作って重ねます。
はい, ただそれだけです。

1. 暗くなっている部分のViewをつくる

shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#80000000">
</LinearLayout>

background の色だけを付けている単純な, レイアウトです。

2. Activity 上で, Viewとして定義して利用する

public class BlackViewActivity extends Activity 
{
	
	private View blackView;

	private boolean black=false;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		
		ActionBar actionBar = getActionBar();
		actionBar.setDisplayHomeAsUpEnabled(true);
		
		blackView = getLayoutInflater().inflate(R.layout.shadow, null);
		blackView.setClickable(false); // No?
		blackView.setVisibility(View.INVISIBLE);
		addContentView(blackView, new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT));
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) 
	{
		switch (item.getItemId()) 
		{
		case android.R.id.home:
			if ( !black )
			{
				showBlack();
				black = true;
			}
			else
			{
				hideBlack();
				black = false;
			}
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private void showBlack() 
	{
		blackView.setVisibility(View.VISIBLE);
	}
	
	private void hideBlack()
	{
		blackView.setVisibility(View.INVISIBLE);
	}
}

今回はActionBarを使って, 出し入れしました。
このページには, レイアウトを入れませんでしたが, setContentView で, レイアウトを入れることも可能です。
ボタンの上とか, 画像の上とかにも重ねることができます

ポイントは, View.VISIBLE, View.INVISIBLE で, Viewの見える見えないを調整しているところです。これだけです。
もともとのレイアウトに, addContentView で追加しています。