AlertDIalog 删除不必要的 space
AlertDIalog Remove unnecessary space
我使用自定义布局在自定义位置显示 AlertDialog。
当我显示警报对话框时,视图右侧的白色变得更多 space,即使我的自定义布局没有那个白色 space。
我按照这个link没有得到太多帮助
详情请看附件
这是我的custom_obstacle_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp"
android:weightSum="3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/one"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="15dp"
android:layout_weight="1"
android:background="@drawable/toggle"
android:checked="true"
android:textOff="Camera"
android:textOn="Camera" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/two"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="15dp"
android:layout_weight="1"
android:background="@drawable/toggle"
android:checked="true"
android:textOff="Lidar"
android:textOn="Lidar" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/three"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="15dp"
android:layout_weight="1"
android:background="@drawable/toggle"
android:checked="true"
android:textOff="Sonar"
android:textOn="Sonar" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
这是我的警报对话框
final AlertDialog.Builder obstacleDialogBuilder = new AlertDialog.Builder(this, R.style.CustomDialog);
obstacleDialogBuilder.setMessage(null);
LayoutInflater inflaterObstacle = this.getLayoutInflater();
View obstacleDialogView = inflaterObstacle.inflate(R.layout.custom_obstacle_dialog, null);
obstacleDialogBuilder.setView(obstacleDialogView);
cameraButton = (ToggleButton) obstacleDialogView.findViewById(R.id.one);
lidarButton = (ToggleButton) obstacleDialogView.findViewById(R.id.two);
sonarButton = (ToggleButton) obstacleDialogView.findViewById(R.id.three);
SharedPreferences app_resources = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE);
boolean obsCamera = app_resources.getBoolean("ObsCamera", true);
boolean obsLidar = app_resources.getBoolean("ObsLidar", true);
boolean obsSonar = app_resources.getBoolean("ObsSonar", true);
cameraButton.setChecked(obsCamera);
lidarButton.setChecked(obsLidar);
sonarButton.setChecked(obsSonar);
if (obsSonar && ultrasonicStatus)
sonarButton.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.red_rounded_button));
if (obsLidar && lidarStatus)
lidarButton.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.red_rounded_button));
if (obsCamera && cameraStatus)
cameraButton.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.red_rounded_button));
cameraButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE).edit();
editor.putBoolean("ObsCamera", isChecked);
editor.apply();
obstacleDetection.cameraDetectioin(isChecked);
}
});
lidarButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE).edit();
editor.putBoolean("ObsLidar", isChecked);
editor.apply();
obstacleDetection.lidarDetectioin(isChecked);
}
});
sonarButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE).edit();
editor.putBoolean("ObsSonar", isChecked);
editor.apply();
obstacleDetection.ultrasonicDetectioin(isChecked);
}
});
obstacleAlertDialog = obstacleDialogBuilder.create();
obstacleAlertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
obstacleAlertDialog.getWindow().getAttributes().windowAnimations = R.style.SlideUpDownAnimation;
WindowManager.LayoutParams wmlp = obstacleAlertDialog.getWindow().getAttributes();
wmlp.gravity = Gravity.TOP | Gravity.RIGHT;
wmlp.x = 100; //x position
wmlp.y = 100; //y position
obstacleAlertDialog.show();
这是我使用的样式
<style name="CustomDialog" parent="Theme.AppCompat.Light.Dialog.Alert">>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<!-- <item name="android:windowBackground">@null</item>-->
<item name="android:windowNoTitle">true</item>
</style>
如果您需要更多信息,请随时询问。
谢谢
我已经尝试更改 window 属性大小,但没有达到您想要的效果。然后我用 @style/Theme.AppCompat.Dialog
替换了你现有的样式 Theme.AppCompat.Light.Dialog.Alert
。现在这让我们可以控制布局。
更改为:
<style name="CustomDialog" parent="@style/Theme.AppCompat.Dialog">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:windowNoTitle">true</item>
</style>
在你的布局文件中,我删除了多余的 LinearLayout
。
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="16dp">
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="#43212121"
android:checked="true"
android:textOff="Camera"
android:textOn="Camera"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/two"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#43212121"
android:checked="true"
android:textOff="Lidar"
android:textOn="Lidar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:background="#43212121"
android:checked="true"
android:textOff="Sonar"
android:textOn="Sonar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/two"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在您的 java 代码中,我不确定是否进行了更改,所以我将其粘贴。
private void showDialogHere() {
AlertDialog.Builder obstacleDialogBuilder = new AlertDialog.Builder(this, R.style.CustomDialog);
obstacleDialogBuilder.setMessage(null);
LayoutInflater inflaterObstacle = this.getLayoutInflater();
View obstacleDialogView = inflaterObstacle.inflate(R.layout.my_dialog, null);
obstacleDialogBuilder.setView(obstacleDialogView);
AlertDialog obstacleAlertDialog = obstacleDialogBuilder.create();
obstacleAlertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = obstacleAlertDialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.TOP | Gravity.RIGHT;
params.x = 100; //x position
params.y = 100; //y position
obstacleAlertDialog.show();
}
让我知道这是否可行。
我将进一步尝试理解为什么样式不允许更改对话框大小。如果我发现任何有用的东西,我会 post。
我还发现此解决方案适用于您的情况 Another answer。
我使用自定义布局在自定义位置显示 AlertDialog。
当我显示警报对话框时,视图右侧的白色变得更多 space,即使我的自定义布局没有那个白色 space。
我按照这个link没有得到太多帮助
详情请看附件
这是我的custom_obstacle_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp"
android:weightSum="3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/one"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="15dp"
android:layout_weight="1"
android:background="@drawable/toggle"
android:checked="true"
android:textOff="Camera"
android:textOn="Camera" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/two"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="15dp"
android:layout_weight="1"
android:background="@drawable/toggle"
android:checked="true"
android:textOff="Lidar"
android:textOn="Lidar" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/three"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="15dp"
android:layout_weight="1"
android:background="@drawable/toggle"
android:checked="true"
android:textOff="Sonar"
android:textOn="Sonar" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
这是我的警报对话框
final AlertDialog.Builder obstacleDialogBuilder = new AlertDialog.Builder(this, R.style.CustomDialog);
obstacleDialogBuilder.setMessage(null);
LayoutInflater inflaterObstacle = this.getLayoutInflater();
View obstacleDialogView = inflaterObstacle.inflate(R.layout.custom_obstacle_dialog, null);
obstacleDialogBuilder.setView(obstacleDialogView);
cameraButton = (ToggleButton) obstacleDialogView.findViewById(R.id.one);
lidarButton = (ToggleButton) obstacleDialogView.findViewById(R.id.two);
sonarButton = (ToggleButton) obstacleDialogView.findViewById(R.id.three);
SharedPreferences app_resources = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE);
boolean obsCamera = app_resources.getBoolean("ObsCamera", true);
boolean obsLidar = app_resources.getBoolean("ObsLidar", true);
boolean obsSonar = app_resources.getBoolean("ObsSonar", true);
cameraButton.setChecked(obsCamera);
lidarButton.setChecked(obsLidar);
sonarButton.setChecked(obsSonar);
if (obsSonar && ultrasonicStatus)
sonarButton.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.red_rounded_button));
if (obsLidar && lidarStatus)
lidarButton.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.red_rounded_button));
if (obsCamera && cameraStatus)
cameraButton.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.red_rounded_button));
cameraButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE).edit();
editor.putBoolean("ObsCamera", isChecked);
editor.apply();
obstacleDetection.cameraDetectioin(isChecked);
}
});
lidarButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE).edit();
editor.putBoolean("ObsLidar", isChecked);
editor.apply();
obstacleDetection.lidarDetectioin(isChecked);
}
});
sonarButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("App_Resources", MODE_PRIVATE).edit();
editor.putBoolean("ObsSonar", isChecked);
editor.apply();
obstacleDetection.ultrasonicDetectioin(isChecked);
}
});
obstacleAlertDialog = obstacleDialogBuilder.create();
obstacleAlertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
obstacleAlertDialog.getWindow().getAttributes().windowAnimations = R.style.SlideUpDownAnimation;
WindowManager.LayoutParams wmlp = obstacleAlertDialog.getWindow().getAttributes();
wmlp.gravity = Gravity.TOP | Gravity.RIGHT;
wmlp.x = 100; //x position
wmlp.y = 100; //y position
obstacleAlertDialog.show();
这是我使用的样式
<style name="CustomDialog" parent="Theme.AppCompat.Light.Dialog.Alert">>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<!-- <item name="android:windowBackground">@null</item>-->
<item name="android:windowNoTitle">true</item>
</style>
如果您需要更多信息,请随时询问。
谢谢
我已经尝试更改 window 属性大小,但没有达到您想要的效果。然后我用 @style/Theme.AppCompat.Dialog
替换了你现有的样式 Theme.AppCompat.Light.Dialog.Alert
。现在这让我们可以控制布局。
更改为:
<style name="CustomDialog" parent="@style/Theme.AppCompat.Dialog">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:windowNoTitle">true</item>
</style>
在你的布局文件中,我删除了多余的 LinearLayout
。
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="16dp">
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="#43212121"
android:checked="true"
android:textOff="Camera"
android:textOn="Camera"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/two"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#43212121"
android:checked="true"
android:textOff="Lidar"
android:textOn="Lidar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatToggleButton
android:id="@+id/three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:background="#43212121"
android:checked="true"
android:textOff="Sonar"
android:textOn="Sonar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/two"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在您的 java 代码中,我不确定是否进行了更改,所以我将其粘贴。
private void showDialogHere() {
AlertDialog.Builder obstacleDialogBuilder = new AlertDialog.Builder(this, R.style.CustomDialog);
obstacleDialogBuilder.setMessage(null);
LayoutInflater inflaterObstacle = this.getLayoutInflater();
View obstacleDialogView = inflaterObstacle.inflate(R.layout.my_dialog, null);
obstacleDialogBuilder.setView(obstacleDialogView);
AlertDialog obstacleAlertDialog = obstacleDialogBuilder.create();
obstacleAlertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = obstacleAlertDialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.TOP | Gravity.RIGHT;
params.x = 100; //x position
params.y = 100; //y position
obstacleAlertDialog.show();
}
让我知道这是否可行。
我将进一步尝试理解为什么样式不允许更改对话框大小。如果我发现任何有用的东西,我会 post。
我还发现此解决方案适用于您的情况 Another answer。