【问题标题】:Android: How to create a Detail alertdialogAndroid:如何创建详细警报对话框
【发布时间】:2012-07-20 17:56:55
【问题描述】:

我一直在玩警报对话框。我想显示一个对话框,显示有关列表视图中列表项的特定信息。就像 android 的文件管理器的详细对话框一样。

图片:https://dl.dropbox.com/u/20856352/detailsbox.jpg

这个详细信息对话框的有趣之处在于它显示的列表项与首选项屏幕中的首选项非常相似。可以点击它们,它们显示了一个布局非常漂亮的两行项目列表项。

我需要创建一个类似的对话框,但我不知道如何完成。我玩了一会儿。首选项 XML 不能用作 alertdialog 的布局。而且我无法开发出类似于上图的布局。需要帮助/指导如何实现这一目标。

法拉兹·阿扎尔

【问题讨论】:

    标签: android android-alertdialog


    【解决方案1】:

    您可能不想使用自定义对话框,因为它很难复制 AlertDialog 的外观。 AlertDialog 可以使用 AlertDialog.setListAdapter 显示项目列表。通过使用 ListAdapter 的自定义实现,您可以自定义项目列表以显示每个项目的两行文本。随附的屏幕截图由以下代码和 xml 生成。

    public class Temp extends Activity
    {
        private String[] listItemsFirstRow = {"item 1", "item 2", "item 3"};
        private String[] listItemsSecondRow = {"item 1", "item 2", "item 3"};
    
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
    
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setAdapter(new MyAdapter(), null);
            builder.setTitle("Title");
            builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
    
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
    
            builder.show();
        }
    
        class MyAdapter extends BaseAdapter
        {
    
            @Override
            public int getCount() 
            {
                return listItemsFirstRow.length;
            }
    
            @Override
            public Object getItem(int position) 
            {
                //this isn't great
                return listItemsFirstRow[position];
            }
    
            @Override
            public long getItemId(int position) 
            {
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) 
            {
                if(convertView == null)
                {
                    convertView = getLayoutInflater().inflate(R.layout.main, null);
                }
    
                ((TextView)convertView.findViewById(R.id.text1)).setText( listItemsFirstRow[position]);
                ((TextView)convertView.findViewById(R.id.text2)).setText( listItemsSecondRow[position]);
    
                return convertView;
            }
    
        }
    }
    

    main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:minHeight=![enter image description here][2]"?android:attr/listPreferredItemHeight"
        android:orientation="vertical"
        android:gravity="center_vertical"
        android:paddingLeft="15dip"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:id="@+id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary" 
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    

    【讨论】:

    • 非常感谢!这似乎正是我正在寻找的东西。
    【解决方案2】:

    刚刚使您的 xml 文件与常规屏幕/页面相同

    然后将此代码放在您的 onCreate() 上

    AlertDialog.Builder builder;
    
            LayoutInflater inflater = getLayoutInflater();
            View layout = inflater.inflate(R.layout.toast_info,
                    (ViewGroup) findViewById(R.id.toast_layout_root));
    
            builder = new AlertDialog.Builder(this);
            builder.setView(layout);
            alertDialog = builder.create();
    

    哪个 r.layout.toast_info 是你的 xml 文件 并且 r.id.toast_layout_root 是您的根 xml id(例如 '' )

    当你想展示它时,只需写下这一行

    alertDialog.show();

    【讨论】:

    • 感谢您的超级及时回复。但你所解释的是我已经知道的。我知道如何膨胀警报对话框并显示它。我的问题是注意图像中的两行列表项。我需要指导如何创建该布局。我已经知道如何将该布局插入警报对话框并显示它。再次感谢。
    • @FarazAzhar 您可以设计列表项,然后将列表视图(例如)膨胀到对话框中。你也可以处理点击事件……
    • 您好 Faraz,我可能无法正确理解您的问题。那么,您的问题是如何制作与附件相同的漂亮布局?你是说那个列表视图吗?
    • 如果是,您可能会通过查看本教程获得一些提示mkyong.com/android/android-listview-example
    • 是的,我的问题是关于将对话框的布局设计为尽可能接近附加图像。
    【解决方案3】:

    我的建议是使用 Activity 作为对话框。这种方式很容易创建自定义对话框。这是一个我认为你可以建立的小例子。

    **Activity**
    
    public class CustomDialogEx extends Activity implements OnClickListener {
    
    private Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(this);
    }
    
    
    @Override
    public void onClick(View v) {  // pass your string data via this intent to the custom view
        // show the custom dialog
        Intent i = new Intent();
        // i.putExtra(<your key/value pairs here>
        i.setClass(this, DialogActivity.class);
        startActivity(i);   
    }
    }
    
    ****************************************************************************
    
    **Custom Dialog**
    
    // The Activity will serve as the Dialog
    
    public class DialogActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.your_dialog_layout);
        Intent i = new Intent();
        Bundle b = getIntent().getExtras();
        b.getString(<your key>)
    }
    }
    
    *****************************************************************************
    
    **AndroidManifest**
    
    <activity
        android:name="DialogActivity"
        android:configChanges="keyboardHidden|orientation"
        android:theme="@android:style/Theme.Dialog" >
    </activity>
    

    【讨论】:

      【解决方案4】:
      this may also help you
      
      public class ShareDialog extends Dialog implements android.view.View.OnClickListener{
      
          Context  mcontContext;
          Button  btnok;
          Listview lstview;
      
          public ShareDialog(Context context) {
              super(context);     
              mcontContext= context;
                      //pls replace with your dialog.xml file
              setContentView(R.layout.sharedialog);       
              bindComponent();
              addListener();      
          }
          private void bindComponent() {
              // TODO Auto-generated method stub
              lstview=(Listview) findViewById(R.id.lstdetail);
              btnok=(Button) findViewById(R.id.btnok);
      
                   //bind here listview with your adpter
          }
      
          private void addListener()
          {
      
              btnshareviwifi.setOnClickListener(this);        
          }
      
          @Override
          public void onClick(View v) {
      
              switch (v.getId()) {
              case R.id.btnok:
      
      
                        dismiss();     
      
                  break;
      
      
              default:
                  break;
              }
      
          }
      
      }
      
      
      and where you want to show
      
      ShareDialog  shobje=new ShareDialog  (context);
      
      shobje.show()
      

      【讨论】:

        猜你喜欢
        • 2018-01-10
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 2018-01-23
        相关资源
        最近更新 更多