これを行う簡単な方法はないと思うので、ここで私が提案したいGradientDrawable
のは、古いもののパラメーターに基づいて新しいものを作成することです (16 未満の API の場合)。ここで欠陥を指摘してくれた@StephenNiedzielskiに感謝します — <code>getOrientation() は API 16 未満では使用できません。
ドローアブルを新しく作成するには、ドローアブルの向きが必要なため、リフレクションなしでこれを行う方法はありません。オリエンテーションが既にある場合は、次の操作を実行できます。
GradientDrawable gd = (GradientDrawable) getBackground();
int[] colors = {0xFFFF0000, 0xFFCC0099};
if (android.os.Build.VERSION.SDK_INT >= 16) {
gd = gd.mutate(); // For safe resource handling
gd.setColors(colors);
} else {
// Fallback for APIs under 16.
GradientDrawable ngd = new GradientDrawable(/* Orientation variable */, colors);
// You may have to set other qualities of `ngd` here to make it match.
setBackgroundDrawable(ngd);
}
したがって、その情報がなければ、16 未満の API で Reflection を使用する必要があります。これはハックですが、これらの API の実装は決して変更されないため (更新されていないため) 、かなり安全です。
好みに合う場合は、リフレクションを使用してGradientState
内部クラスにアクセスできます。gd.mGradientState.mOrientation
基本的に、メソッドが実行する呼び出し (コメントで述べたように)をエミュレートする必要がありますgetOrientation()
。どちらも非公開であるため、Reflection を使用する必要があります。