EditText.SetText() 在自定义适配器中更改我的软键盘输入类型

Posted

技术标签:

【中文标题】EditText.SetText() 在自定义适配器中更改我的软键盘输入类型【英文标题】:EditText.SetText() changes my softkeyboard input type in a custom adapter 【发布时间】:2012-03-17 01:37:35 【问题描述】:

我正在使用自定义基础适配器来实现 customListView。 listView 类(扩展 ListView)在主 Activity 中的 Flipper 中使用 flipper.addView(mListView)。

列表视图有 3 种类型的行。 列表中的第一个是带有微调器的行,接下来的 2 个是带有输入文本的 edittext 行。第 3 行及以后的行与包含数字的编辑文本相同。 我想这样做,以便当我单击文本版本时,软键盘将仅显示文本,而对于数字版本,则显示电话键盘。 它们显示正常,但是当您单击编辑文本时出现问题,软键盘以电话格式弹出。 它是在 getView() 中设置的所有设置和值,但是当以电话格式弹出软键盘时,getView() 会再次被调用(逻辑),但是一旦它击中文本类型 EditTexts 的 1,键盘类型就会切换回文本输入.之后它就不能轻易地转回手机风格的显示。该视图似乎在跳跃并努力专注于我想要的 EditText 我真的迷路了,无法弄清楚。 以下是 2 个主要代码。

public class MethodEditorAdapter extends BaseAdapter

private Context context;
private ArrayList<String[]>  scanparam;

private LayoutInflater mInflater; 

public MethodEditorAdapter(Context context, ArrayList<String[]> scanparam )  
    super();
    this.scanparam = scanparam;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


@Override
public long getItemId(int position) 
    int i = 0;
    if(position == 0) i = 0;
    if(position ==1) i = 1;         
    if(position == 2)i = 1;
    if (position > 2)i = 2;
    return i;

@Override
public int getViewTypeCount() 
    return 3;


@Override
public int getItemViewType(int position) 
    int i = 0;
    if(position == 0) i = 0;
    if(position ==1) i = 1;         
    if(position == 2)i = 1;
    if (position > 2)i = 2;
    return i;


public View getView(int position, View convertView, ViewGroup parent)  

    Formatnames(position);
    View rowView = convertView;
    ViewHolder holder = null;
    int type = getItemViewType(position);

    if (rowView == null ) 

        holder = new ViewHolder();
        switch (type) 
        case 0:
            rowView = mInflater.inflate(R.layout.method_editor_row_spin, null);
            holder.paramname = (TextView) rowView.findViewById(R.id.techniquetag);
            holder.techniquespinner = (Spinner) rowView.findViewById(R.id.techniquespinner);
            break;
        case 1:
            rowView = mInflater.inflate(R.layout.method_editor_row_text, null);
            holder.paramname = (TextView) rowView.findViewById(R.id.paramnameT);
            holder.paramvalue = (EditText) rowView.findViewById(R.id.paramvalT);
            break;
        case 2:
            rowView = mInflater.inflate(R.layout.method_editor_row_number, parent, false);
            holder.paramnameNum = (TextView) rowView.findViewById(R.id.paramnameN);
            holder.paramvalueNum = (EditText) rowView.findViewById(R.id.paramvalN);
            break;
        
        rowView.setTag(holder);


    else 
        holder = (ViewHolder) rowView.getTag();
    

    setSelectedPosition(position);


    switch (type) 
    case 0:
        holder.paramname.setText(namestg + " " + nd);
        holder.techniquespinner.setSelection(Integer.valueOf(scanparam.get(position)[1]));
        break;
    case 1:
        holder.paramname.setText(namestg + " " + nd);
        holder.paramvalue.setText(scanparam.get(position)[1]);
        break;
    case 2:
    holder.paramnameNum.setText(namestg + " " + nd);
    holder.paramvalueNum.setText(scanparam.get(position)[1]);
    

    return rowView;


static class ViewHolder 
    public TextView paramname;
    public EditText paramvalue;
    public Spinner techniquespinner;
    public TextView paramnameNum;
    public EditText paramvalueNum;


主视图

public class MethodEditorView extends ListView 

private ArrayList<String[]> thismethod = new ArrayList<String[]>();

public MethodEditorAdapter editorAdapter;

private ListView mListView;

private Context mContext;

public MethodEditorView(Context context, ArrayList<String[]> methodlist)  
    super(context);
    // TODO Auto-generated constructor stub
    this.thismethod = methodlist;
    mContext = context;enter code here
initview(context);


 private void initview(Context context)
    editorAdapter = new MethodEditorAdapter(context, thismethod );
    this.setAdapter(editorAdapter);

 

xml,抱歉我无法正确插入。这是数字类型的。

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_ android:layout_weight="1" android:layout_ android:id="@+id/methodrownumber">
    <TextView android:layout_ android:layout_weight="1" android:textSize="16sp" android:textStyle="bold" android:id="@+id/paramnameN" android:layout_ android:padding="5dp"></TextView>
    <EditText android:layout_ android:layout_ android:textSize="16sp" android:layout_weight="1" android:id="@+id/paramvalN" android:imeOptions="actionNext" android:inputType="phone" android:focusable="true" android:focusableInTouchMode="true" android:clickable="true"></EditText>

【问题讨论】:

【参考方案1】:

经过几天和几天,这是我流畅的可编辑列表视图的解决方案。 您必须设置 2 项绝对最重要的东西,以使它们工作和可编辑,而不会一直失去焦点。

最关键的1是。 在清单中

<activity android:name=".youractivity" android:windowSoftInputMode="adjustPan"/>

那么 在列表视图的 xml 中

android:descendantFocusability="beforeDescendants"

mListView.setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);

最后一个 1 只是在列表视图之外的任何其他视图(例如操作栏)的顶部使用打开的编辑器放大列表视图。很适合小屏幕! 在此对话中发现*** link

【讨论】:

我将否决我自己的答案,因为带有焦点的 ListViews 很好......废话。不要做他们! ScrollView 绝对是前进的方向,我实现了一个自定义的“BaseAdapter”样式类,用于用我的行填充滚动视图。 感谢您描述并尝试解决问题。自从您建议使用 ScrollView 而不是 ListView 已经 6 年了。你还在用同样的方法吗?是否像在运行时向滚动视图内的垂直线性布局添加控件一样简单? 嗨,是的,我仍然使用 ScrollView,但我的视图不是很大。我在滚动视图中使用带有行的表格布局来控制布局位置。我的滚动视图通常有 30 行【参考方案2】:

让我为您的列表视图中的编辑文本省去很多麻烦。不要这样做。我花了一个多星期的时间试图在列表视图中获取 edittext 以不回收输入,以确保在您恢复时正确的输入在正确的字段中。我建议在一天结束时使用看起来像列表视图的表格布局制作滚动视图。只要您没有大量的行,它就可以正常工作。现在,如果假设您有 100 行,那不会很漂亮。

    public class inputpage extends Activity implements OnClickListener

        public TableLayout tl;
        static Map<Integer, String> inputValues = new LinkedHashMap<Integer, String>();
        private dbadapter mydbhelper;
        public static int editCount;
        private PopupWindow pw;
        public Cursor cursor;
        private ArrayList<EditText> m_edit = new ArrayList<EditText>();

        @Override
    protected void onCreate(Bundle savedInstanceState) 
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        mydbhelper = new dbadapter(this);
        mydbhelper.open();
        setContentView(R.layout.tablelayout);
        tl=(TableLayout) this.findViewById(R.id.table);
        getCursor();
        editCount = cursor.getCount();
        buildRow();

        View footer = getLayoutInflater().inflate(R.layout.footer_layout, null);
        tl.addView(footer);





        
//This lets me get a cursor so I can settext on my textviews
        public void getCursor()
        if(main.quickStart == "Cate")
            cursor = mydbhelper.getUserWord();
        ...

            //add my rows in a loop based off how many items my cursor brought back
        public void buildRow()
            //params for my different items
            LayoutParams textparam = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT, .30f);
            LayoutParams editparam = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT, .70f);
            textparam.setMargins(2, 2, 2, 2);
            editparam.setMargins(2, 2, 2, 2);
            editparam.gravity=17;
            LayoutParams rowparam = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
            cursor.moveToFirst(); //make sure cursor starts at beginning
            for (int i = 0; i < editCount; i++)
                TableRow tr = new TableRow(this);
                tr.setLayoutParams(rowparam); 

                //textview
                TextView tv=new TextView(this);
                tv.setLayoutParams(textparam);
                tv.setText(cursor.getString(cursor.getColumnIndex("userword")));
                tv.setTextSize(35f);
                tv.setGravity(Gravity.CENTER);
                tv.setWidth(175);
                tv.setTextColor(getResources().getColor(R.color.black));
                tr.addView(tv);

                //edittext
                EditText edit = new EditText(this);
                edit.setLayoutParams(editparam);
                tr.addView(edit);
                edit.setGravity(Gravity.LEFT);
                edit.setId(editCount);
                m_edit.add(i, edit);
                edit.setText("");

                cursor.moveToNext();
                tl.addView(tr, new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
            

希望这对您有所帮助并为您省去很多麻烦。顺便说一句,我在 xml(表格布局、页脚等)中构建了我能做的东西,并通过 java 制作我的表格行。

【讨论】:

抱歉,个人原因,回复延迟。我喜欢这个主意,而且我的清单永远不会超过 20 行。但我忘了提到我是动态构建它的,因为我有大约 12 个不同的列表视图,每个列表视图的布局略有不同,所以我只是回收行。我在下面发布了另一个替代方案 见下文我最后使用了ScrollView

以上是关于EditText.SetText() 在自定义适配器中更改我的软键盘输入类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在editText.setText()中插入一个字符串

edittext.settext() 将键盘类型更改为默认值 [从 ?123 到 ABC]

在自定义适配器中隐藏软键盘

如何在自定义适配器中使用 String[]?

在自定义 Listview 适配器中使用多个视图

AsyncTask 在自定义适配器中不起作用