4

各行に EditText が機能する ListView があります。

編集テキストをクリックしてこのテキストを選択し、カーソルを消去または移動せずに数字を書き込む必要があります。

最初に selectAllonfocus を使用するとうまくいきます。ただし、リストビューをスクロールした後、EditText がおかしくなり、選択が正しく機能しません。

リスナー onFocus で selectAll を実行すると、タッチが行われると、選択の代わりにコンテキスト メニュー (単語の選択、すべての選択など) が表示されます。

誰かが助けることができれば。

ありがとう。

4

6 に答える 6

2

あなたがやろうとしていることが何なのかわかりません。おそらく、関連するソースコードのいくつかを投稿できれば役立つでしょう...

しかし、スクロールを開始するとおかしくなるという事実により、アダプターのgetView()メソッドでconvertViewを正しく処理していないことがわかります。

于 2012-05-22T21:16:51.857 に答える
1

次のようにして、まったく同じ問題に対処しました。

  1. ListView を使用して xml から android:descendantFocusability="beforeDescendants" を削除し、AndroidManifest から android:windowSoftInputMode="adjustPan" を削除します - それらは役に立ちません。
  2. サブクラス化された EditText

    public class TrickyEditText extends EditText {
    
        private boolean mFocused = false;
        private boolean mTouched = false;
    
        public TrickyEditText(Context context) {
            super(context);
        }
    
        public TrickyEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public TrickyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public TrickyEditText(Context context, AttributeSet attrs, int defStyleAttr, int style) {
            super(context, attrs, defStyleAttr, style);
        }
    
        @Override
        public boolean didTouchFocusSelect() {
            if (mTouched && mFocused) {
                return true;
            } else {
                return super.didTouchFocusSelect();
            }
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            mTouched = true;
            return super.onTouchEvent(event);           
        }
    
        @Override
        protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
            mFocused = focused;
            if (!focused) {
                mTouched = false;
            }
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
        }
    }
    
    1. アダプターコード

      public class TrickyAdapter extends ArrayAdapter {
      
          .............
      
          @Override
          public View getView(int childPosition, View convertView, final ViewGroup parent) {
      
              .........
      
              TrickyEditText et = ..... //initialize edittext
      
              et.setOnFocusChangeListener(new OnFocusChangeListener() {
      
                  @Override
                  public void onFocusChange(final View v, boolean hasFocus) {
                      if (hasFocus) {
                          v.post(new Runnable() {
      
                              @Override
                              public void run() {
                                  ((EditText)v).selectAll();
                              }
                          });                    
                      }
                  }
              });
      
              .........
          }
      }
      

それはかなりうまくいっていますが、それは私が誇りに思うコードではありません...誰かがもっときれいな解決策を知っているなら、教えてください!

于 2015-02-26T17:18:19.920 に答える
1

スクロール後に問題が発生した場合は、ビューのリサイクルが問題になっています。基本的には、EditTexts の内容を保持する配列を設定して、スクロールしても混乱しないようにする必要があります。あなたはあなたのリストを支持しているものを言いませんでしたが、私は編集テキストが含まれているリストを持っています.

public class CursorAdapter_EditText extends SimpleCursorAdapter {

    private static Cursor c;
    private Context context;
    public static String[] quantity;
    private int layout;

    public CursorAdapter_EditText(Context context, int layout, Cursor c,
                        String[] from, int[] to) {
        super(context, layout, c, from, to);
        CursorAdapter_EditText.c = c;
        this.context = context;
        this.layout = layout;
        initializeQuantity();    //  Call method to initialize array to hold edittext info
    }

    public static void initializeQuantity() {
        quantity = new String[c.getCount()];    //  Initialize array to proper # of items
        int i = 0;
        while (i < c.getCount()) {              
                        quantity[i] = "";       // set all EditTexts to empty
                        i++;
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
                        convertView = View.inflate(context, layout, null);
        final int pos = position;
        View row = convertView;
        c.moveToPosition(position);
        TextView name = (TextView) row.findViewById(R.id.ListItem1);
        EditText qty = (EditText) row.findViewById(R.id.qty);
        qty.setOnFocusChangeListener(new View.OnFocusChangeListener() {  //  Set so EditText will be saved to array when you leave it
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    LinearLayout parent = (LinearLayout) v.getParent();            
                    EditText qtyTemp = (EditText) parent.findViewById(R.id.qty);   //  Get a reference to EditText (you could probaly use v here)
                    quantity[pos] = qtyTemp.getText().toString();              // Save contents of EditText to array
                }
            }
        });
        name.setText(c.getString(1));
        unit.setText(c.getString(3));
        qty.setText(quantity[position]);
        return (row);
    }
}

次に、配列の外側に、次のように処理してデータベースに戻すボタンがあります。

commit.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        int i = 0;
        itemCursor.moveToFirst();
        while (itemCursor.isAfterLast() == false) {
            if (CursorAdapter_EditText.quantity[i].equals("")) {
                CursorAdapter_EditText.quantity[i] = "0";
            }
            ;
            int tempQty = Integer
                    .parseInt(CursorAdapter_EditText.quantity[i]);
            if (tempQty != 0) {
                mDbHelper.createListItem(listId, itemCursor
                        .getInt(itemCursor
                                .getColumnIndex(GroceryDB.ITEM_ROWID)),
                        tempQty, 0);
            }
            i++;
            itemCursor.moveToNext();
        }
    }
});
于 2012-05-23T04:00:34.940 に答える
0

私が尋ねたことについて言えることは、リストビュー edittexts のすべてのテキストを選択しようとしても正しく機能しないということです。テキストを選択する代わりに、ユーザーが数字などを選択するダイアログを表示します。

于 2012-06-17T09:55:38.240 に答える
0

まだ解決策を探しているかどうかはわかりませんが、それを行う方法を見つけました。アダプターの getView メソッドの edittext にフォーカス変更リスナーを追加し、フォーカスを受け取ったときにすべてのテキストを選択します。

public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    // blah blah blah

    EditText edit = (EditText) view.findViewById(R.id.editTextId);
    edit.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus)
                ((EditText) view).selectAll();
        }
    });

    return view;
}

windowSoftInputMode をアクティビティのadjustPanに設定しましたが、この問題とは関係がないと思います。

Android 2.3 および 4 でこれをテストしましたが、動作します。

于 2013-08-05T05:11:30.687 に答える