Установка общедоступных переменных int в методе

#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. о да. у меня есть еще одна идея, вы можете снова создать этот файл и скопировать те же данные, что и раньше, может быть, это сработает, или еще одна вещь, с которой может возникнуть проблема для ссылки, я думаю, вам также следует перезапустить ваше полное приложение и редактор.