Урок 15. Контекстное меню

Обсуждение уроков
betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 15. Контекстное меню

Сообщение betirsolt » 18 июл 2014, 00:06

Народ кто нибудь ответит мне?

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 15. Контекстное меню

Сообщение betirsolt » 19 июл 2014, 04:38

подскажите пожалуйста как закрепить группу меню за определенным View элементом

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 15. Контекстное меню

Сообщение Foenix » 19 июл 2014, 14:35

смысла нет это делать, ты пойми. Почитай гайдлайны гугла, ты хочешь с десктопного поведения, где была правая клавиша мыши и контекстное меню - перетащить это в андроид. Это не верно. Нужно делать единообразные по функционалу приложения, чтобы пользователь знал чего от него ожидать и как им пользоваться без инструкций.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 15. Контекстное меню

Сообщение betirsolt » 19 июл 2014, 18:10

Foenix писал(а):смысла нет это делать, ты пойми. Почитай гайдлайны гугла, ты хочешь с десктопного поведения, где была правая клавиша мыши и контекстное меню - перетащить это в андроид. Это не верно. Нужно делать единообразные по функционалу приложения, чтобы пользователь знал чего от него ожидать и как им пользоваться без инструкций.
Почему нет смысла? разве у каждого View элемента не может быть свое контекстное меню? тогда как мне это реализовать?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 15. Контекстное меню

Сообщение Foenix » 19 июл 2014, 21:40

betirsolt писал(а):тогда как мне это реализовать?
я же сказала - у гугла посмотри
http://developer.android.com/index.html
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 15. Контекстное меню

Сообщение Mikhail_dev » 19 июл 2014, 23:40

Не совсем понял вопроса. Вроде же в коде есть условие выбора элемента. Хотя может быть нерабочее, я уже давно не работал с этим меню. В принципе завтра смогу глянуть, если чуть поподробнее проблему опишут.

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 15. Контекстное меню

Сообщение betirsolt » 20 июл 2014, 00:10

Mikhail_dev писал(а): Не совсем понял вопроса. Вроде же в коде есть условие выбора элемента. Хотя может быть нерабочее, я уже давно не работал с этим меню. В принципе завтра смогу глянуть, если чуть поподробнее проблему опишут.
это все из урока про контекстное меню
вот код из MainActivity

Код: Выделить всё

package com.example.p0151_contextmenu;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
	final int MENU_COLOR_RED = 1;
	final int MENU_COLOR_GREEN = 2;
	final int MENU_COLOR_BLUE = 3;
	
	final int MENU_SIZE_22 = 4;
	final int MENU_SIZE_26 = 5;
	final int MENU_SIZE_30 = 6;
	TextView tvColor, tvSize;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		tvColor = (TextView) findViewById(R.id.tvColor);
		tvSize = (TextView) findViewById(R.id.tvSize);
		
		//Для tvColor и tvSize необходимо создавать контекстное меню
		registerForContextMenu(tvColor);
		registerForContextMenu(tvSize);
	}
	
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
		 getMenuInflater().inflate(R.menu.mymenu, menu);
		
	}
	
	@Override
	public boolean onContextItemSelected(MenuItem item){
		switch(item.getItemId()){
		//Пункты меню для tvColor
		case MENU_COLOR_RED:
			tvColor.setTextColor(Color.RED);
			tvColor.setText("Text color = Red");
			break;
		case MENU_COLOR_GREEN:
			tvColor.setTextColor(Color.GREEN);
			tvColor.setText("Text color = Green");
			break;
		case MENU_COLOR_BLUE:
			tvColor.setTextColor(Color.BLUE);
			tvColor.setText("Text color = Blue");
			break;
			//пункты меню для tvSize
		case MENU_SIZE_22:
			tvSize.setTextSize(22);
			tvSize.setText("Text size = 22");
			break;
		case MENU_SIZE_26:
			tvSize.setTextSize(26);
			tvSize.setText("Text size = 26");
			break;
		case MENU_SIZE_30:
			tvSize.setTextSize(30);
			tvSize.setText("Text size = 30");
			break;
		}
		return super.onContextItemSelected(item);
	}
	}
вот код из Layout файла main.xml

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="50dp"
        android:layout_marginTop="50dp"
        android:text="Text Color"
        android:textSize="26sp" />
    
    
        <TextView
        android:id="@+id/tvSize"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Text Size"
        android:textSize="22sp" />

</LinearLayout>
а вот код из файла mymenu.xml в папке menu

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <group android:id="@+id/ColorGroup">
        <item 
        android:id="@+id/MENU_COLOR_GREEN"
        android:title="Green"/>
   
    <item 
        android:id="@+id/MENU_COLOR_RED"
        android:title="Red"/>
   
        <item 
        android:id="@+id/MENU_COLOR_BLUE"
        android:title="Blue"/>
    
      </group>  

<group android:id="@+id/SizeGroup">
      
        <item 
        android:id="@+id/MENU_SIZE_22"
        android:title="22"/>
   
    
        <item 
        android:id="@+id/MENU_SIZE_26"
        android:title="26"/>
  
    
        <item 
        android:id="@+id/MENU_SIZE_30"
        android:title="30"/>
        </group>
    
</menu>
в данном случае у меня при длительном нажатии на обоих TextView показывается полное меню из 6 пунктов, а мне нужно чтоб при нажатии на TextView tvColor показывались пункты меню отвечающие за цвет, т.е только 3 пункта из моего меню, и для tvSize точно так же, и еще при нажатии на пункты меню не меняется ничего, цвет текста, размер и сам текст, надеюсь так понятно?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 15. Контекстное меню

Сообщение Donart » 20 июл 2014, 08:52

в данном случае у меня при длительном нажатии на обоих TextView показывается полное меню из 6 пунктов, а мне нужно чтоб при нажатии на TextView tvColor показывались пункты меню отвечающие за цвет, т.е только 3 пункта из моего меню, и для tvSize точно так же, и еще при нажатии на пункты меню не меняется ничего, цвет текста, размер и сам текст, надеюсь так понятно?
Вы не реализовали метод onCreateContextMenu.

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 15. Контекстное меню

Сообщение betirsolt » 20 июл 2014, 18:38

Donart писал(а):

Вы не реализовали метод onCreateContextMenu.
вот же у меня есть этот метод

Код: Выделить всё

  @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
         getMenuInflater().inflate(R.menu.mymenu, menu); 
         
    }
а как его еще реализовать? что дописать?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 15. Контекстное меню

Сообщение Donart » 20 июл 2014, 18:50

а как его еще реализовать? что дописать?
Вы его просто пропустили, смотрите урок там все есть. Имею ввиду пропустили реализацию из урока :)

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 15. Контекстное меню

Сообщение betirsolt » 20 июл 2014, 20:39

Donart писал(а):
а как его еще реализовать? что дописать?
Вы его просто пропустили, смотрите урок там все есть. Имею ввиду пропустили реализацию из урока :)
по уроку делается не так, по уроку я сделал и все работает, просто автор порекомендовал в конце урока сделать эти меню через файл menu.xml самостоятельно, вот я и пытаюсь

Аватара пользователя
Zyabrrr
Сообщения: 1
Зарегистрирован: 28 июл 2014, 19:02

Re: Урок 15. Контекстное меню

Сообщение Zyabrrr » 29 июл 2014, 14:11

Хотелось бы конечно иметь возможность создавать несколько блоков меню в одном xml и вызывать их по одному. Но, полистав гид разрабов понял, что такого не предусмотрено. Ажаль. Стало быть, только 2 варианта: либо отдельный xml под каждое меню, либо каждый раз тащить всё меню целиком, стыдливо прикрывая неактуальные группы. Прокомментируйте пожалуйста, правильно ли я понял ?
В теме зелен, но желание научиться велико. Так что, поучайте и журите сейчас, пока есть такая аказия ; )

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 15. Контекстное меню

Сообщение Irrumator » 26 окт 2014, 18:06

Такой вопрос к знатокам: возможно ли в onContextItemSelected прописать действие, ну скажем, изменение текста, но не конкретного view, как сделано в уроке:

Код: Выделить всё

 tvColor.setTextColor(Color.GREEN);
      tvColor.setText("Text color = green");
а того view, при нажатии на который и было вызвано контекстное меню?
Иными словами, в моем приложении - сотни TextView, и задумано, чтобы пользователь, нажимая на любой из них, получал Контекстное меню, и в зависимости от выбранного пункта - меняется текст в этом самом TextView.
Я конечно, мог бы для каждого TextView создать отдельное контекстное меню, как это сделано в уроке, но в этом был бы смысл, если бы они были различны по сути. У меня же - все контекстные менюшки одинаковы.
И мне кажется, есть способ проще, чем прописывать сотню раз case/break'и...
Для наглядности, отрывок из кода:

Код: Выделить всё

//опишем создание контекстных меню
	 @Override
	  public void onCreateContextMenu(ContextMenu menu, View v,
	      ContextMenuInfo menuInfo) {

	    switch (v.getId()) {
//менюшка для первой textview
	    case R.id.ball1_1:
	      menu.add(0, 1, 0, "1 балл");
	      menu.add(0, 2, 0, "2 балла");
	      menu.add(0, 3, 0, "3 балла");
	      break;
	    case R.id.ball1_2:
//менюшка для второй textview, абсолютно идентичное
		  menu.add(0, 4, 0, "1 балл");
		  menu.add(0, 5, 0, "2 балла");
		  menu.add(0, 6, 0, "3 балла");
	      break;
	    }
	  }
	 //обработчик нажатия пунктов меню
	 @Override
	    public boolean onContextItemSelected(MenuItem item) {
	      switch (item.getItemId()) {
	      // пункты меню для 1 textview
	    case 1:
	    	numball1_1=1;
   	        tvball1_1.setText(Integer.toString(numball1_1));
	      break;
	    case 2:
	    	numball1_1=2;
                tvball1_1.setText(Integer.toString(numball1_1));
	      break;
	    case 3:
	    	numball1_1=3;
   	        tvball1_1.setText(Integer.toString(numball1_1));
	      break;


	    // пункты меню для 2 textview
	    case 4:
	    	numball1_2=1;
   	        tvball1_2.setText(Integer.toString(numball1_2));
	      break;
	    case 5:
	    	numball1_2=2;
    	        tvball1_2.setText(Integer.toString(numball1_2));
	      break;
	    case 6:
	    	numball1_2=3;
   	        tvball1_2.setText(Integer.toString(numball1_2));
	      break;
	      }
   	  tvitog1.setText(Integer.toString(numball1_1+numball1_2));
	      return super.onContextItemSelected(item);
	    }
тут всего 2 TextViewa, но как видно, Контекстное меню и результат нажатия - идентичен. И этот код занимает 50 строк, а для пары сотен это будет уже 5000 .О.о.
Неужели нет способа сделать проще? Применять одно "шаблонное" контекстное меню ко всем view, и результат возвращать в это самое view?
Если контекстное меню не подходит для этих целей, будьте добры, направьте на путь истинный.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 15. Контекстное меню

Сообщение Foenix » 26 окт 2014, 21:43

ох уж эти любители сотен текствью..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 15. Контекстное меню

Сообщение Irrumator » 27 окт 2014, 01:48

Foenix, рад услышать советы, чем их можно заменить)
Приложение - таблица, состоящая из этих сотен TV, ума не приложу, как можно реализовать это по другому, с возможностью интерактива на каждом элементе.
Ну и, собственно, хотелось бы услышать предположения по моему вопросу о "шаблонном" контекстном меню или его альтернативе.
Сегодня вечером посмотрю, получится ли нечто подобное с диалогами. Если нет - придется увеличить код на несколько тысяч строк в onContextItemSelected....

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 15. Контекстное меню

Сообщение doter.ua » 27 окт 2014, 10:33

Возможно вам подойдет создание dialog-а (alert dialog) типа указываешь макет xml который заранее подготовил (или используешь какой-нибудь стандартный) допустим в своем макете 3 кнопки. Потом создаешь диалог по своему макету(очень легко гуглится ). когда диалог готов можно его вызвать методом .show(). Когда вызывать? по лонг клику OnLongClickListener, т.е. будет как контекстное меню. И еще во время создания диалога (до вызова show) можно назначить кнопкам обработчики (собсна поменять цвет или еще что-то..).
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 15. Контекстное меню

Сообщение Foenix » 27 окт 2014, 15:41

ListView нужно использовать, а не сотни TextView
Контекстное меню устарело, необходимо использовать контекстный режим ActionBar. Как его делать в соотствествии с листвью - в сети куча туториалов. А ты изобретаешь велосипед. Так уже лет 15 никто не программирует, наверное.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 15. Контекстное меню

Сообщение Irrumator » 27 окт 2014, 17:56

По поводу сотен TV - это более наглядный вариант отображения моих данных, как мне кажется.
В любом случае, вот решение моей проблемы:
http://ogrelab.ikratko.com/identifying- ... ed-method/

Но возник новый казус...жду Вас в теме viewtopic.php?f=47&p=36741#p36741

Persik
Сообщения: 19
Зарегистрирован: 15 май 2014, 08:55

Re: Урок 15. Контекстное меню

Сообщение Persik » 03 ноя 2014, 14:13

Добрый день! Спасибо за урок, мне очень помогло. Но, у меня есть вопрос. Как отображать контекстного меню за один клик в listview? Вот мой исходник, все что написала. Но он не показывает контекстное меню.

Код: Выделить всё

public class Day extends ListFragment  {
		@Override
		 public void onCreate(Bundle savedInstanceState) {	  
		  super.onActivityCreated(savedInstanceState);
		    
		 DayAdapter myListAdapter = new DayAdapter(getActivity(), R.layout.text_fragment, names);
		  setListAdapter(myListAdapter);
		}
		
		@Override
		 public View onCreateView(LayoutInflater inflater, ViewGroup container,
		  Bundle savedInstanceState) {	  
		   View rootView =inflater.inflate(R.layout.listview, container, false);
		   ListView lv = (ListView)rootView.findViewById(android.R.id.list);
		   lv.setOnItemClickListener(new OnItemClickListener() {
			  
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				registerForContextMenu(view);
							}
		
		   public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
				menu.setHeaderTitle("Hello");
				menu.setHeaderIcon(R.drawable.up);
				menu.add(0, 0, 0, "Item One");
				menu.add(0, 1, 0, "Item Two");
			}
		});
       return rootView;
}
}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 15. Контекстное меню

Сообщение Foenix » 03 ноя 2014, 19:23

registerForContextMenu(view);
это надо делать не в теле данного метода
и лучше не делать контекстное меню - это уже раритет, а воспользоваться ActionMode, он появляется по лонгклику
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
...
mActionMode = getActivity().startActionMode(mActionModeCallback);
...}
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить