Android - v.getId () в контекстном меню возвращает значение «ложь» - PullRequest
0 голосов
/ 16 октября 2010

У меня есть контекстное меню.Функция v.getId () должна возвращать идентификатор, но не возвращает - вместо этого она возвращает «ложь».

Вот мой код:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
super.onCreateContextMenu(menu, v, menuInfo);  
    menu.setHeaderTitle("Options");  
    menu.add(0, v.getId(), 0, v.getId());  
    menu.add(0, v.getId(), 0, "Save Notification");  
}  

@Override  
public boolean onContextItemSelected(MenuItem item) {  
    if(item.getTitle()=="Save Ringtone"){function1(item.getItemId());}  
    else if(item.getTitle()=="Save Notification"){function2(item.getItemId());}  
    else {return false;}  
return true;  
}  

public void function1(int id){  
    //Stuff
} 

public void function2(int id){
    if (id == R.raw.tedcake){
        Toast.makeText(this, id, Toast.LENGTH_SHORT).show();
    }

Кнопки были зарегистрированы дляконтекстное меню в другом месте кода.

Почему оно возвращает false?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 31 октября 2012

У меня была такая же проблема ... в папке res / values ​​у вас должен быть идентификатор файла, для каждого элемента есть четыре атрибута (имя, тип, формат, значение).В моем случае поле «значение» было «ложно»

1 голос
/ 09 сентября 2012

это потому, что большинство функций в Android принимают строку , а не int , как и тост. попробуйте String.valueOf (view.getId ()) , чтобы вы увидели идентификатор. ты добро пожаловать

1 голос
/ 16 октября 2010

view.getId() возвращает int, а не false.Если представление фактически не имеет идентификатора, оно возвращает NO_ID, который является константой, равной -1.Одна проблема, которую я вижу с вашим кодом, заключается в том, что вы сравниваете строки, используя ==.Вы должны использовать равно.Об этом много SO-сообщений, если вы хотите узнать больше.

1 голос
/ 16 октября 2010
  1. Невозможно, чтобы v.getId() вернул false. Возвращает целое число, которое не будет логическим когда-либо .
  2. С другой стороны, что это должно делать ?: menu.add(0, v.getId(), 0, v.getId());. Вы передаете v.getId() в последнем параметре, что вызовет проблемы (так как он ожидает идентификатор ресурса String, а не идентификатор ресурса представления). Может быть, вы имели в виду menu.add(0, v.getId(), 0, "Save Ringtone");?

Относительно вашего вопроса: «почему я становлюсь ложным?». Это из-за этого:

if(item.getTitle()=="Save Ringtone"){function1(item.getItemId());}  
else if(item.getTitle()=="Save Notification"){function2(item.getItemId());}
else return false;

Это общая проблема для новых разработчиков Java. Проблема здесь: item.getTitle()=="Save Ringtone"; в частности, проблема ==. Это не то, как вы сравниваете объекты в Java . Вы должны использовать метод equals, таким образом:

if(item.getTitle().equals("Save Ringtone")){function1(item.getItemId());}  
else if(item.getTitle().equals("Save Notification")){function2(item.getItemId());}
else return false;

Если вы используете оператор == с объектами, вы сравниваете ссылки на объект, а не на объект.

0 голосов
/ 04 января 2012

У меня была похожая проблема с вами. view.getID() всегда будет возвращать целое число, поэтому я решил посмотреть, что произойдет, если я приведу целое число к строке в тосте. Этот метод покажет вам идентификатор. Я полагаю, что причина, по которой вы видите false, заключается в том, что toast выдает ошибку при вводе целого числа вместо последовательности символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...