#java #android #eclipse
#java #Android #eclipse
Вопрос:
вот мой код:
public class MainMenuActivity extends Activity implements OnClickListener {
public int width;
public int height;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenu);
Button play = (Button) findViewById(R.id.playbut);
Button credits = (Button) findViewById(R.id.creditsbut);
Button help = (Button) findViewById(R.id.helpbut);
play.setOnClickListener(this);
credits.setOnClickListener(this);
help.setOnClickListener(this);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels;
height = dm.heightPixels;
}
проблема в том, что для общедоступной ширины int не устанавливается значение dm.widthPixels, а также для высоты. Какие-либо советы?
Комментарии:
1. Они есть, если в
dm
свойствах есть значение; что заставляет вас думать, что это не так?2. Что бы ни говорилось в вашем названии, это не разрешено в Java.
3. @BheshGurung — более того, на самом деле это не имеет отношения к задаваемому вопросу.
Ответ №1:
Приведенный код должен привести к установке атрибутов. Если этого не происходит, то должно происходить что-то еще:
- Возможно, метод не вызывается.
- Возможно, значения
dm
атрибутов пикселей не соответствуют вашим ожиданиям. - Возможно, что-то еще изменяет значения
width
иheight
после вызова метода. - …
- Возможно, код, который вы на самом деле запускаете, не соответствует исходному коду, который вы нам показали… или фактический код, на который вы смотрите. (Например, у вас может возникнуть проблема с вашими процедурами сборки / развертывания.)
Если вы зашли в тупик, попробуйте запустить с помощью отладчика и установить точку останова в методе. Выполните один шаг метода и проверьте фактические устанавливаемые значения.
Комментарии:
1. Хороший отладчик также должен иметь возможность устанавливать точку останова всякий раз, когда изменяется значение переменной. Это поможет вам определить, изменяет ли другой класс что-то под вами (хотя гораздо лучший способ обнаружить и предотвратить это — сделать переменные закрытыми).
Ответ №2:
Такого рода проблема заключается в том, что обычно считается плохой практикой иметь общедоступные переменные экземпляра. Вам гораздо лучше сделать переменные экземпляра закрытыми и иметь общедоступный геттер, если вам это нужно. Это означает, что вы можете гарантировать, что никто не изменит значение без вашего ведома:
public class MainMenuActivity ... {
private int width;
private int height;
public int getWidth() {
return width;
}
// etc
}
Если вы внесете это изменение, вы, вероятно, сразу обнаружите, кто изменял значение под вами — независимо от того, что устанавливало значения width
и height
, теперь не удастся скомпилировать.
Ответ №3:
это.width = dm.widthPixels; это.высота = dm.heightпикселей;
да, вы можете попробовать это, и если все еще это не работает, вы можете попробовать это, изменив тип данных width и height int на double. может быть проблемой предела. если это сработает, тогда скажите мне.
Комментарии:
1. Изменение типа данных ни на что не повлияет. Если бы это была проблема с точностью, то произошла бы ошибка компилятора. Добавление
this
также ничего не даст, потому что здесь не происходит затенения.2. о да. у меня есть еще одна идея, вы можете снова создать этот файл и скопировать те же данные, что и раньше, может быть, это сработает, или еще одна вещь, с которой может возникнуть проблема для ссылки, я думаю, вам также следует перезапустить ваше полное приложение и редактор.