[解決済み] Androidで、dpの余白をプログラムで設定する方法を教えてください。
質問
で これ , これ そして これ のスレッドで、シングルビューにマージンを設定する方法について答えを見つけようとしました。しかし、私はもっと簡単な方法がないのかと思っていました。私がこの方法を使いたくない理由を説明します。
Buttonを継承したカスタムButtonがあります。もし、背景がデフォルトの背景以外のものに設定された場合、(
setBackgroundResource(int id)
または
setBackgroundDrawable(Drawable d)
) を呼び出すと、余白が0になるようにしたいのですが、どうしたらいいでしょうか。
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
余白を-3dpにリセットしてほしい(すでに
ここで
ピクセルからdpへの変換方法を知っているので、pxでマージンを設定する方法を知っていれば、自分で変換を管理できます)。しかし、これは
CustomButton
クラスでは、親がLinearLayoutからTableLayoutまで異なることがあり、親を取得してその親のインスタンスをチェックするようなことは避けたいですね。これもかなり非効率になると思います。
また、(LayoutParamsを使用して)呼び出す際に
parentLayout.addView(myCustomButton, newParams)
例えば、5つ並んだボタンの真ん中に追加されるかどうかはわかりません。
質問です。単一のボタンのマージンをプログラム的に設定する簡単な方法はありますか? LayoutParamsを使用する以外にありますか?
EDIT: LayoutParamsの方法は知っていますが、異なるコンテナタイプごとに処理することを回避するソリューションが欲しいです。
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
なぜなら
this.getLayoutParams();
は
ViewGroup.LayoutParams
という属性を持っていない
topMargin
,
bottomMargin
,
leftMargin
,
rightMargin
.
あなたが見ている mc インスタンスは、単に
MarginContainer
オフセット(-3dp)の余白と(oml, omr, omt, omb)、元の余白(ml, mr, mt, mb)を含んでいるものである。
どのように解決するのですか?
を使用する必要があります。
LayoutParams
を使用してボタンの余白を設定します。
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
どのようなレイアウトを使用しているかに応じて
RelativeLayout.LayoutParams
または
LinearLayout.LayoutParams
.
また、dpメジャーをpixelに変換するには、次のようにします。
Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
yourdpmeasure,
r.getDisplayMetrics()
);
関連
-
AndroidがMainActivityが包含クラスでないというエラーを報告する
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
adb devices OffLine Solution(オフラインソリューション
-
armeabi-v7a armeabi arm64-v8a パラメータの意味説明
-
android.os の NetworkOnMainThreadException。
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
Gradle のエラーです。gradle-core.jar (com.android.tools.build:gradle-core:x.x.x) を見つけられませんでした。
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
アプリの実行エラー。ターゲットデバイスが見つからない問題
-
android.content.ActivityNotFoundException を解決します。Intent問題を処理するActivityが見つからない
-
[解決済み】プログラムによるLinearLayoutのマージン設定