【问题标题】:Make AlertDialog Custom自定义警报对话框
【发布时间】:2014-02-02 18:11:56
【问题描述】:

我正在使用此代码显示警报对话框

  holder.tv1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        AlertDialog.Builder nointernetconnection = new AlertDialog.Builder(
                                temp);
                        nointernetconnection
                                .setIcon(R.drawable.ic_launcher)
                                .setTitle(list.get(position).getAS_name())
                                .setMessage(list.get(position).getDesc_art())
                                .setCancelable(true)
                                .setPositiveButton("OK",
                                        new DialogInterface.OnClickListener() {
                                                   @Override
                                            public void onClick(DialogInterface arg,
                                                    int arg1) {



                                            }
                                        });
                        AlertDialog a = nointernetconnection.create();
                        a.show();

如果文本比较多但标题文本没有被完整查看或标题空间不可滚动,消息体会自动转换为滚动视图。

所以,我想扩展标题区域并使其可滚动,为此我不想使用自定义对话框,我只想通过 AlertDialog 实现它。

【问题讨论】:

标签: android android-alertdialog android-custom-view android-dialog


【解决方案1】:

您可以使用AlertDialog.Builder 类的.setCustomTitle 方法为对话框的标题元素指定自定义布局文件。(因为这仍然使用AlertDialog 类而不是自定义(或子类)对话框,我认为这是一个有价值的答案)。像这样:

AlertDialog.Builder alert = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
View view=inflater.inflate(R.layout.titlebar, null);
alert.setCustomTitle(view);

Android docs reference.setCustomTitle(View customTitleView)

或者您可以将标题字体缩小一些,但根据内容的多少,如果标题太小而无法阅读,即使有标题也可能变得毫无意义。

【讨论】:

    【解决方案2】:

    这个例子是一个典型的 hack...你也不需要自定义 View...

    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.drawable.ic_launcher);
        final String title = "This is a Big Title. This is a Big Title. This is a Big Title. This is a Big Title. This is a Big Title. This is a Big Title. ";
        builder.setTitle(title);
        builder.setMessage("This is a Message. This is a Message. This is a Message. This is a Message.");
        builder.setCancelable(false);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        AlertDialog alertDialog = builder.create();
        alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                AlertDialog alertDialog = (AlertDialog) dialog;
                ViewGroup viewGroup = (ViewGroup) alertDialog.getWindow()
                        .getDecorView();
                TextView textView = findTextViewWithTitle(viewGroup, title);
                if (textView != null) {
                    textView.setEllipsize(null);
                    textView.setMaxHeight((int) (80 * alertDialog.getContext().getResources().getDisplayMetrics().density)); 
                    textView.setMovementMethod(new ScrollingMovementMethod());
                }
            }
        });
        alertDialog.show();
    }
    
    private TextView findTextViewWithTitle(ViewGroup viewGroup, String title) {
        for (int i = 0, N = viewGroup.getChildCount(); i < N; i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof TextView) {
                TextView textView = (TextView) child;
                if (textView.getText().equals(title)) {
                    return textView;
                }
            } else if (child instanceof ViewGroup) {
                ViewGroup vGroup = (ViewGroup) child;
                return findTextViewWithTitle(vGroup, title);
            }
        }
        return null;
    }
    

    【讨论】:

      【解决方案3】:

      如果你真的不想使用自定义标题视图,可以将对话框标题设为多行:

      TextView title = (TextView) dialog.findViewById(android.R.id.title); 
      title.setSingleLine(false);
      

      如果您想要一个滚动标题,或使用自定义标题,那么您唯一的(好的)选择就是使用自定义警报对话框标题。申请难度不大:

      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      TextView textView = new TextView(context);
      textView.setText("your very long title here");
      builder.setCustomTitle(textView);
      

      【讨论】:

      • 你应该用你自己的对话框替换对话框,在你的情况下:nointernetconnection
      【解决方案4】:

      这是我的自定义对话框类。它有几个构造函数来显示您想要显示的内容:按钮、进度、仅是标题和消息......自定义布局您将能够拥有更长的标题。您甚至可以将一个采用其字体大小的自定义文本视图插入到可用的空间中。希望对您有所帮助。

      public class CustomDialogClass extends Dialog implements android.view.View.OnClickListener {
      
      public Activity c;
      public Dialog d;
      public Button yes, no;
      private int showButtons;
      private String tit, msg, yesT, noT;
      private boolean custom=false, all= false, progresss=false, spinner=false, indeterminateputted=false, indet=false;
      private TextView title, subtit;
      private ProgressBar progressBar, progressBar2;
      private int max;
      private int progress;
      
      public OnPositiveDialogButtonClicked positive;
      
      public CustomDialogClass(Activity a) {
      
          super(a);
          this.c = a;
          this.custom = false;
      }
      
      public CustomDialogClass(Activity a, int botones) {
      
          super(a);
          this.c = a;
          this.showButtons = botones;
          this.custom = false;
      }
      
      public CustomDialogClass(Activity a, int botones, String tit, String message) {
      
          super(a);
          this.custom = true;
          this.c = a;
          this.showButtons = botones;
          this.tit = tit;
          this.msg = message;
      }
      
      public CustomDialogClass(Activity a, String tit, String message, String yes, String no) {
      
          super(a);
          this.custom = true;
          this.c = a;
          this.tit = tit;
          this.msg = message;
          this.yesT = yes;
          this.noT = no;
          this.all = true;
      }
      
      public CustomDialogClass(Activity a, String tit, String message, int max, int progress) {
      
          super(a);
          this.progresss = true;
          this.tit = tit;
          this.msg = message;
          this.max = max;
          this.progress = progress;
      }
      
      public CustomDialogClass(Activity a, String tit, String message, int max, int progress, boolean spinner) {
      
          super(a);
          this.tit = tit;
          this.msg = message;
          this.max = max;
          this.progress = progress;
          this.spinner = true;
      }
      
      public CustomDialogClass(Activity a, String tit, String message, boolean indet) {
      
          super(a);
          this.progresss = true;
          this.indeterminateputted = true;
          this.indet = indet;
          this.tit = tit;
          this.msg = message;
      }
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      
          super.onCreate(savedInstanceState);
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          setContentView(R.layout.dialog_view);
          yes = (Button) findViewById(R.id.btn_yes);
          no = (Button) findViewById(R.id.btn_no);
          title = (TextView) findViewById(R.id.txt_dia);
          subtit = (TextView) findViewById(R.id.messageDialog);
          progressBar = (ProgressBar) findViewById(R.id.dialogProgress);
          progressBar2 = (ProgressBar) findViewById(R.id.dialogProgress2);
      
          if(this.indeterminateputted) this.progressBar.setIndeterminate(indet);
      
          yes.setOnClickListener(this);
          no.setOnClickListener(this);
      
          if(tit!=null && tit.length()>0) title.setText(tit);
          if(msg!=null && msg.length()>0) subtit.setText(msg);
          if(yesT!=null && yesT.length()>0) yes.setText(yesT);
          if(noT!=null && noT.length()>0) no.setText(noT);
          if(showButtons==0) {
      
              yes.setVisibility(View.GONE);
              no.setVisibility(View.GONE);
          }
          if(spinner) {
      
              subtit.setVisibility(View.VISIBLE);
              progressBar.setVisibility(View.GONE);
              progressBar2.setVisibility(View.VISIBLE);
              yes.setVisibility(View.GONE);
              no.setVisibility(View.GONE);
          }
          if(progresss) {
      
              subtit.setVisibility(View.VISIBLE);
              progressBar.setVisibility(View.VISIBLE);
              yes.setVisibility(View.GONE);
              no.setVisibility(View.GONE);
              progressBar.setMax(max);
              progressBar.setProgress(0);
          }
          if(all) {
      
              subtit.setVisibility(View.VISIBLE);
              yes.setVisibility(View.VISIBLE);
              no.setVisibility(View.VISIBLE);
          }
          else if(custom){
      
              subtit.setVisibility(View.VISIBLE);
              yes.setVisibility(View.GONE);
              no.setVisibility(View.GONE);
          }
      }
      
      @Override
      public void onClick(View v) {
      
          switch (v.getId()) {
      
          case R.id.btn_yes:
      
              positive.onPositive(true);
              break;
          case R.id.btn_no:
      
              positive.onPositive(false);
              dismiss();
              break;
          default:
      
              break;
          }
          dismiss();
      }
      
      public void setButtonListener(OnPositiveDialogButtonClicked listener) {
      
          positive = listener;
      }
      
      public void setProgress(int progress) {
      
          if(progressBar!=null) {
      
              this.progress = progress;
              progressBar.setProgress(progress);
          }
      }
      
      public void setMessage(String msg) {
      
          if(subtit!=null) subtit.setText(msg);
      }
      
      public void setTitle(String titleee) {
      
          if(title!=null) title.setText(titleee);
      }
      
      public int getProgress() {
      
          return this.progress;
      }
      
      public int getMax() {
      
          return this.max;
      }
      
      public void setIndeterminate(boolean indet) {
      
          this.progresss = true;
          this.indeterminateputted = true;
          this.indet = indet;
      }
      }
      

      按钮界面:

      public interface OnPositiveDialogButtonClicked {
      
      public void onPositive(boolean clickedYes);
      }
      

      布局:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical"
      android:background="@color/white" >
      
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@drawable/gradientbackground"
          android:orientation="horizontal" >
      
          <TextView
              android:id="@+id/txt_dia"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:layout_marginTop="20dp"
              android:layout_marginBottom="20dp"
              android:layout_marginLeft="10dp"
              android:textColor="@android:color/white"
              android:textSize="16sp"
              android:textStyle="bold"
               >
          </TextView>
      </LinearLayout>
      
      <TextView
          android:id="@+id/messageDialog"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center"
          android:layout_gravity="center"
          android:layout_margin="10dp"
          android:textColor="@color/black"
          android:textSize="13sp"
          android:visibility="gone"
          android:textStyle="bold" >
      </TextView>
      
      <ProgressBar
          style="@android:style/Widget.ProgressBar.Horizontal"
          android:id="@+id/dialogProgress"
          android:layout_margin="10dp"
          android:visibility="gone"
          android:layout_gravity="center"
          android:layout_width="250dp"
          android:layout_height="4dp"
      />
      
      <ProgressBar
          style="?android:attr/progressBarStyleLarge"
          android:id="@+id/dialogProgress2"
          android:visibility="gone"
          android:layout_gravity="center"
          android:layout_width="wrap_content"
          android:layout_height="45dp"
      />
      
      <LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:layout_marginBottom="5dp"
          android:background="@color/white"
          android:orientation="horizontal" >
      
          <Button
              android:id="@+id/btn_yes"
              android:layout_width="100dp"
              android:layout_height="45dp"
              android:background="@android:color/white"
              android:clickable="true"
              android:text="Yes"
              android:textSize="13sp"
              android:textColor="#5DBCD2"
              android:textStyle="bold" />
      
          <Button
              android:id="@+id/btn_no"
              android:layout_width="100dp"
              android:layout_height="45dp"
              android:layout_marginLeft="5dp"
              android:background="@android:color/white"
              android:clickable="true"
              android:text="No"
              android:textSize="13sp"
              android:textColor="#5DBCD2"
              android:textStyle="bold" />
      </LinearLayout>
      

      【讨论】:

        【解决方案5】:

        你有两个选择-

        1. 您可以创建自定义对话框视图并显示您的内容。这是一个例子

                  final Dialog dialog1 = new Dialog(CatchTheCatActivity.this);
              dialog1.requestWindowFeature(Window.FEATURE_NO_TITLE);
              dialog1.setContentView(R.layout.custom_alert);
              Button ok = (Button) dialog1.findViewById(R.id.button1);
          
              TextView title = (TextView) dialog1.findViewById(R.id.textview1);
              TextView content = (TextView) dialog1.findViewById(R.id.textview2);
              title.setText("your long title")
              content.setText("your long content");
          
              ok.setOnClickListener(new OnClickListener()
              {
                  @Override
                  public void onClick(View v) 
                  {
                          dialog1.dismiss();  
          
                  }
              });
              dialog1.show();
          

        其中 R.layout.custom_alert 是您要显示的 UI(在您的情况下,2 textview 底部有一个按钮)。 Ref

        1. 使用popupwindow。这是example

        【讨论】:

          【解决方案6】:

          您可以在对话框中完全导入布局,如果需要,您可以为对话框设置标题或在布局中放置一个文本字段作为标题。

          LayoutInflater factory = LayoutInflater.from(context);
                  final View textEntryView = factory.inflate(your_layout_id, null);
                  Builder builder = new Builder(context);
                  builder.setTitle(title);//Optional can be added in layout
          
          
                  mAlertDialog = builder.create();
                  mAlertDialog.setCancelable(false);
                  mAlertDialog.setView(textEntryView, 10, 10, 10, 10);
          

          【讨论】:

            【解决方案7】:

            *您可以通过创建自定义布局来自定义警报对话框。

            *在 re/layout 文件夹中创建自定义 XML 文件

            *您可以按照自己的方式设计。

            *在你的活动类中,你必须在创建方法中写入

            我回家了,这对你有用。

            对话框 d = new Dialog(MainActivity.this);

            d.setcontentview(R.layout.custom);

            //例如你有一个编辑文本和按钮,你可以通过声明来实现

            EditText ed = (EditText)d.findViewById(R.id.ed1);
            
            
            Button b = (Button)d.finviewById(R.id.b1);
            
            Button b = (Button)d.finviewById(R.id.b1);
            

            //你可以在按钮上点击listner像

            b.setOnClickListner(new .....);
            

            警报警报 = d.create(); d.show();

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-04-13
              • 1970-01-01
              • 2023-03-13
              • 2011-06-17
              相关资源
              最近更新 更多