3

我在使用带有 ListView 的 DialogFragment 时遇到问题。当我在 onCreate 中使用 setStyle 时出现问题。

这是代码(为了更清楚地了解这个问题,我用洋红色为列表文本视图着色):

import android.app.DialogFragment;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MenuDialog extends DialogFragment {

    public static MenuDialog create() {
        MenuDialog frag = new MenuDialog();
        return frag;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE, 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ListView v = new ListView(getActivity());
        v.setAdapter(new BaseAdapter() {

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView view = null;
                if (convertView == null) {
                    view = new TextView(getActivity());
                    view.setTextAppearance(getActivity(), android.R.style.TextAppearance_Large);
                    view.setPadding(15, 15, 15, 15);
                    view.setBackgroundColor(Color.MAGENTA);
                }
                else
                    view = (TextView) convertView;

                switch (position) {
                case 0: view.setText("Random"); break;
                case 1: view.setText("Community favourites"); break;
                case 2: view.setText("Change image"); break;
                case 3: view.setText("Share"); break;
                case 4: view.setText("Informations"); break;
                }

                return view;
            }

            @Override public long getItemId(int arg0) { return 0; }
            @Override public Object getItem(int arg0) { return null; }
            @Override public int getCount() { return 5; }
        });
        return v;
    }
}

这是它提供的对话框的图像:

无标题:不工作

现在,如果我简单地评论 setStyle(STYLE_NO_TITLE, 0); 在 onCreate 方法中,一切都按预期工作:

标题:作品

我究竟做错了什么 ?我不能使用简单的 AlertDialog 因为我需要自定义更多这些列表项。

编辑: 您可以在此处下载演示问题的演示 Android Eclipse 项目

4

4 回答 4

2
  1. 列表.xml

    <?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="wrap_content"
      android:orientation="vertical" >
    
      <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
    
         />
    
     </LinearLayout>
    
  2. menu_rowview.xml

     <?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="wrap_content"
        android:orientation="horizontal"
      android:id="@+id/linear"
             >
    
           <TextView
              android:id="@+id/textView1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginBottom="10dp"
              android:layout_marginLeft="20dp"
              android:layout_marginRight="20dp"
              android:layout_marginTop="10dp"
              android:text="@android:string/unknownName"
              android:textAppearance="?android:attr/textAppearanceLarge" />
    
             </LinearLayout>
    
  3. 更改 onCreateView() (在您的项目中)

      public View onCreateView(final LayoutInflater inflater, ViewGroup container,    Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.list, container);
    ListView v=(ListView) view.findViewById(R.id.list);
    v.setAdapter(new BaseAdapter() {
    
        public View getView(int position, View convertView, ViewGroup parent) {
            View rowView = null;
            if (convertView == null) {
                rowView = inflater.inflate(R.layout.menu_rowview, parent, false);
    
            }
            else
                rowView = convertView;
            LinearLayout lay=(LinearLayout) rowView.findViewById(R.id.linear);
            lay.setBackgroundColor(Color.MAGENTA);
            TextView textView = (TextView) rowView.findViewById(R.id.textView1);
            switch (position) {
            case 0: textView.setText("Random"); break;
            case 1: textView.setText("Community favourites"); break;
            case 2: textView.setText("Change image"); break;
            case 3: textView.setText("Share"); break;
            case 4: textView.setText("Informations"); break;
            }
    
            return rowView;
        }
    
        @Override public long getItemId(int arg0) { 
            return arg0; }
        @Override public Object getItem(int arg0) { return arg0; }
        @Override public int getCount() { return 5; }
    });
    return view;
    }
    
于 2012-09-28T11:32:21.197 回答
1

在 onCreate 方法中使用此代码

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

于 2014-01-04T12:58:22.827 回答
1

使用android:minWidth="360dp"在您的TextView

于 2013-03-16T13:20:10.350 回答
0

这个问题今天让我疯狂一整天,这绝对是系统中的一个错误。我最终要解决的问题是我离开了 STYLE_NO_TITLE 因为我真的不想处理标题,我的其他对话框样式进入主题:

fragment.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog);

这当然会在某些手机上带来问题,这不仅仅是背景的问题,也是一个可触摸的区域。现在讨厌的 hacky 修复在我的项目 xml 布局中:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:height="48dp"
    android:width="600dp"
    android:textSize="19sp"
    android:textColor="@color/blue"
    android:paddingLeft="16dp"
    android:gravity="center_vertical"
    />

将宽度硬编码为大值是一个技巧,但我不太确定它如何影响低分辨率设备的性能。在 Kindle Fire、Nexus 7 和 2.2 的模拟器上测试 希望这对某人有所帮助

于 2013-05-30T06:09:15.337 回答