自定义Dialog遇到的坑
dialog在项目中运用应该是相当的多了,特别是在删除某些内容的时候一般会有确认提示。因为设计的需要我得自定义一套dialog用来显示,但是遇到了一些坑,记录下来防止继续掉进坑里。
这三个图分别是错误的自定义 正确的自定义以及系统默认的效果。
下面贴上源码
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button standard,self,selfTwo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
standard = findViewById(R.id.button_standard);
standard.setOnClickListener(this);
self = findViewById(R.id.button_self);
self.setOnClickListener(this);
selfTwo = findViewById(R.id.button_two);
selfTwo.setOnClickListener(this);
}
//默认效果
private void showDialog1() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("我是系统默认的样子");
builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "来啊 骚年点我啊", Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("Cancel", null);
AlertDialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
//错误自定义效果
private void showDialog2(){
View view = LayoutInflater.from(this).inflate(R.layout.dialog_two,null);
AlertDialog dialog = new AlertDialog.Builder(this).create();
dialog.show();
dialog.setContentView(view);
}
//正确的自定义效果
private void showDialog3() {
View view = LayoutInflater.from(this).inflate(R.layout.dialog_item, null);
final AlertDialog dialog = new AlertDialog.Builder(this).create();
dialog.show();
Window window = dialog.getWindow();
WindowManager.LayoutParams params =dialog.getWindow().getAttributes();
int height = 400;
int width = 400;
params.height = height;
params.width = width;
window.setAttributes(params);
window.setContentView(view);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_standard:
showDialog1();
break;
case R.id.button_self:
showDialog2();
break;
case R.id.button_two:
showDialog3();
break;
}
}
}
布局代码很简单 就三个按钮所以不贴了。需要注意的是我自定义的时候传入的布局。
首先是错误的自定义布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#336699">
<TextView
android:id="@+id/text_message"
android:layout_width="200dp"
android:layout_height="150dp"
android:layout_centerHorizontal="true"
android:gravity="center"
android:textColor="@color/colorAccent"
android:textSize="30sp"
android:text="错误的自定义" />
<TextView
android:id="@+id/cancel"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:gravity="center"
android:textColor="@color/colorAccent"
android:textSize="30sp"
android:text="cancel" />
<TextView
android:id="@+id/sure"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:text="Sure"
android:textColor="@color/colorAccent"
android:textSize="30sp"
android:textAllCaps="false" />
</RelativeLayout>
可以看到我在布局中用的是200dp,但是实际显示的却几乎铺满了窗口。接下来我们看看正确的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#336699">
<TextView
android:id="@+id/text_message"
android:layout_width="200dp"
android:layout_height="150dp"
android:layout_centerHorizontal="true"
android:gravity="center"
android:textColor="@color/colorAccent"
android:textSize="30sp"
android:text="正确的姿势" />
<TextView
android:id="@+id/cancel"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:gravity="center"
android:textColor="@color/colorAccent"
android:textSize="30sp"
android:text="cancel" />
<TextView
android:id="@+id/sure"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:text="Sure"
android:textColor="@color/colorAccent"
android:textSize="30sp"
android:textAllCaps="false" />
</RelativeLayout>
在这里我用了match_parent但是显示的却是200dp。这是为什么呢?其实我表示我也很懵逼啊! 所以我就各种找资料啊 找了很久还是没找到答案,后来我终于找到了。
感谢这位作者给与的帮助使用自定义视图的AlertDialog 这个文章里面讲得已经很详细了。
总之,虽然我暂时不能理解很深,但是也要记录下来至少要先弄出效果,至于原理嘛 现在似乎还能力不足o(╥﹏╥)o