Android.R.attr.selectableItemBackgroundは存在しますが、ImageButtonにプログラムで追加するにはどうすればよいですか?
また、ドキュメントで答えを見つけるにはどうすればよいですか? here に言及されていますが、実際にどのように使用されているかについての説明はありません。実際、私はドキュメントが役に立つとはめったに思わないが、それが私のせいであり、ドキュメントのせいではないことを望んでいる。
ここに答えを使用した例があります: コードでattr参照を取得する方法?
// Create an array of the attributes we want to resolve
// using values from a theme
// Android.R.attr.selectableItemBackground requires API LEVEL 11
int[] attrs = new int[] { Android.R.attr.selectableItemBackground /* index 0 */};
// Obtain the styled attributes. 'themedContext' is a context with a
// theme, typically the current Activity (i.e. 'this')
TypedArray ta = obtainStyledAttributes(attrs);
// Now get the value of the 'listItemBackground' attribute that was
// set in the theme used in 'themedContext'. The parameter is the index
// of the attribute in the 'attrs' array. The returned Drawable
// is what you are after
Drawable drawableFromTheme = ta.getDrawable(0 /* index */);
// Finally free resources used by TypedArray
ta.recycle();
// setBackground(Drawable) requires API LEVEL 16,
// otherwise you have to use deprecated setBackgroundDrawable(Drawable) method.
imageButton.setBackground(drawableFromTheme);
// imageButton.setBackgroundDrawable(drawableFromTheme);
AppCompatを使用している場合、次のコードを使用できます。
int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
view.setBackgroundResource(backgroundResource);
typedArray.recycle();
これは私のTextView
で動作します:
// Get selectable background
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
clickableTextView.setClickable(true);
clickableTextView.setBackgroundResource(typedValue.resourceId);
AppCompatライブラリを使用するため、R.attr.selectableItemBackground
ではなくAndroid.R.attr.selectableItemBackground
を使用します。
typedValue.resourceId
は、selectableItemBackground
のすべてのドロウアブルを保持していると思います。TypeArray#getResourceId(index, defValue)
またはTypeArray#getDrawable(index)
を使用するよりも、指定されたindex
でドロウアブルのみを取得します。
この方法を試してください:
public Drawable getDrawableFromAttrRes(int attrRes, Context context) {
TypedArray a = context.obtainStyledAttributes(new int[] {attrRes});
try {
return a.getDrawable(0);
} finally {
a.recycle();
}
}
//次に、次のように呼び出します。
getDrawableFromAttrRes(R.attr.selectableItemBackground, context)
// Example
ViewCompat.setBackground(view,getDrawableFromAttrRes(R.attr.selectableItemBackground, context))