Некоторые кнопки отображаются только в ландшафтном режиме - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу, чтобы определенные кнопки отображались только в альбомной ориентации, а не показывались и не были доступны в портретной ориентации.У меня есть отдельные XML-файлы для ландшафта и портрета

Я попытался использовать OrientationEventListener и во время его работы я проверил ориентацию устройства в альбомной ориентации - если это так, я вызвал findViewById на нем, но он вылетает из-заNullPointer.Мой код на данный момент:

Button landscapeTest;

public boolean isInLandscape() {
int orientation = getResources().getConfiguration().orientation;
return orientation == Configuration.ORIENTATION_LANDSCAPE;

OrientationEventListener orientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {
@Override
public void onOrientationChanged(int orientation) {
   boolean isInLandscape = isInLandscape();
   if (isInLandscape) {
       landscapeTest = findViewById(R.id.button_landscape);
       landscapeTest.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Log.v("landscapeButton", "I am working!!!");
           }
       });
   }
}
};

Ожидается - когда я меняю ориентацию устройства (с книжной на альбомную), я должен видеть кнопку с идентификатором button_landscape в пользовательском интерфейсе, и когда я нажимаю на нее, я должен видеть"Я работаю!!!"в журнале

Фактически: когда я меняю ориентацию устройства (от портрета до пейзажа), происходит сбой с помощью NullPointer, потому что не удается найти кнопку.

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Как я уже упоминал в разделе комментариев. Вы хотите обрабатывать видимость вашего Button только при изменении ориентации.

landscapeTest = findViewById(R.id.button_landscape);

должно быть в OnCreate, а также OnClickListener.

Вот пример:

public class SomeActivity extends Activity {    

Button landscapeTest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_some);

    landscapeTest = findViewById(R.id.button_landscape);
    landscapeTest.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           Log.v("landscapeButton", "I am working!!!");
       }
    });

    OrientationEventListener orientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {
    @Override
    public void onOrientationChanged(int orientation) {
        boolean isInLandscape = isInLandscape();
        if (isInLandscape) {
        landscapeTest.setVisibility(View.GONE);
        }else{
        landscapeTest.setVisibility(View.VISIBLE);
        }
    }

}
0 голосов
/ 09 апреля 2019

Попробуйте это Вам поможет:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            landscapeTest.setVisibility(View.VISIBLE);
        } else {
            landscapeTest.setVisibility(View.GONE);
        }
    }
0 голосов
/ 09 апреля 2019

Причина сбоя заключается в том, что при изменении ориентации Android перезапускает действие.И снова звонит OnCreate().

Пожалуйста, прочитайте Обработка изменений во время выполнения

1) Если вы хотите показать другой макет в другом режиме, я бы предложил создать отдельный файл дляпортретный режим (layout / layout.xml) и ландшафтный режим (layout-land / layout.xml) с одинаковыми именами.Таким образом, Android будет обрабатывать изменение ориентации.

2) Если вы не хотите создавать два отдельных файла макета и обрабатывать его из файла класса.Переместите код на OnCreate() и проверьте, находится ли макет в книжной или альбомной ориентации с OnCreate()Потому что onClickListener не принадлежит к onOrientationChanged.Это также решит проблему NullPointerException.В зависимости от ориентации вы можете скрыть / показать кнопку.

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