Android - EditTexts в галерее показывают странное поведение при (длительном) щелчке - PullRequest
1 голос
/ 13 августа 2011

моя программа основана на примере Google Gallery:
http://developer.android.com/guide/tutorials/views/hello-gallery.html
Вместо использования изображений я создаю группу EditText s в конструкторе.

Myвопрос теперь: когда я долго нажимаю на EditText, я хочу, чтобы его контекстное меню (с «выбрать все», «копировать» и так далее), чтобы было показаноЯ попытался установить OnItemLongClickListener, который вызывает выбранное представление с помощью myGallery.getAdapter().getView(position, ...).showContextMenu(), но это приводит к StackOverflowError (это причина, по которой я разместил здесь свой вопрос - хорошо, этот вопрос был хромым):

08-13 16:02:36.062: ERROR/AndroidRuntime(3400): FATAL EXCEPTION: main
java.lang.StackOverflowError
 at android.widget.AdapterView.getPositionForView(AdapterView.java:581)
 at android.widget.Gallery.showContextMenuForChild(Gallery.java:1049)
 at android.view.View.showContextMenu(View.java:2520)
 at de.test.gallery2.Main$1.onItemLongClick(Main.java:51)
 at android.widget.Gallery.dispatchLongPress(Gallery.java:1074)
 at android.widget.Gallery.showContextMenuForChild(Gallery.java:1055)

Я также пытался registerForContextMenu() Gallery, затем EditTexts, а затем оба, но все не удалось.У кого-нибудь из вас есть решение?

Кстати, Галерея показывает другое странное поведение: при запуске приложения первый EditText центрируется, но не может быть отредактирован, когда я нажимаю на него,Но когда я нажимаю на второй (который не центрирован), я могу редактировать тот, который не центрирован.Когда я центрирую второй EditText, я могу редактировать только третий и так далее.Когда я центрирую последний, фокус, кажется, полностью исчезает, и ничто больше не может быть отредактировано.

Я, вероятно, выйду за вас замуж, если вы сможете мне помочь.Любая помощь приветствуется.И поверьте мне - я провел много исследований, прежде чем задавать этот вопрос.Действительно.
Большое спасибо

m1ntf4n

РЕДАКТИРОВАТЬ

Вот код моей активности.Извините за двойной пост, возможность редактирования не учитывалась.

public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Gallery gallery = (Gallery) findViewById(R.id.gallery);
        gallery.setAdapter(new LocalAdapter(this));
        gallery.setSpacing(50);

        registerForContextMenu(gallery);

        //Register the EditViews for ContextMenu.
        for(int i = 0; i < gallery.getAdapter().getCount(); ++i) {
            registerForContextMenu(gallery.getAdapter().getView(i, null, null));
        }

        //This listener will cause a StackOverflowError.
        /*gallery.setOnItemLongClickListener(new Gallery.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> a, View v, int i, long l) {
                return gallery.getAdapter().getView(i, null, null).showContextMenu();
            }
        });*/
    }

    public class LocalAdapter extends BaseAdapter {
        private Context mContext;
        private EditText[] editText;

        public LocalAdapter(Context c) {
            mContext = c;
            editText = new EditText[5];
            for(int i = 0; i != editText.length; ++i) {
                editText[i] = new EditText(mContext);
                editText[i].setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                editText[i].setText("TEXT " + i);
                editText[i].setTextSize(30);
            }
        }
        @Override
        public int getCount() {
            return editText.length;
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return editText[position];
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 14 августа 2011

Из документации Google:

public void registerForContextMenu (Просмотреть представление)

Регистрирует контекстное меню, которое будет отображаться для данного представления (несколько представления могут показать контекстное меню). Этот метод установит View.OnCreateContextMenuListener для представления этого действия, поэтому onCreateContextMenu (ContextMenu, View, ContextMenuInfo) когда пришло время показывать контекстное меню.

Как видно из документации, onCreateContextMenu () будет вызываться в Main перед отображением контекстного меню. Вам нужно будет переопределить этот метод, чтобы создать собственное контекстное меню.

0 голосов
/ 14 августа 2011

Спасибо, прославленный хакер. Вы привели меня к следующему решению:

  1. В методе действия onCreate() нам требуется registerForContext(myGallery).

  2. Создайте свой собственный класс MyEditText, который расширяет EditText. В этом классе (конечно, после добавления конструкторов) вам нужно сделать доступным защищенный метод EditText::onCreateContextMenu():

    @Override
    public void onCreateContextMenu(ContextMenu menu) {
        super.onCreateContextMenu(menu);
    }
    
  3. Вернитесь в занятие, сделайте

    @Override
    public void onCreateContextMenu(ContextMenu contextMenu, View v, 
                                    ContextMenu.ContextMenuInfo menuInfo) 
    {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        ((MyEditText) info.targetView).onCreateContextMenu(contextMenu);
    }
    

    Первая строка получает представление, запрашивающее контекстное меню, вторая вызывает (10) * (теперь видимый) EditText, поэтому при длительном нажатии появляется контекстное меню, к которому привык пользователь.

...