2015-09-02 3 views
20

У меня есть App Widget, который, когда он обновляет, получает изображение, имеющее размеры в соответствии с виджетами, и помещает это изображение в ImageView (через RemoteViews). Он работает отлично.Обнаружение вращения главного экрана Android

Но для устройств, которые поддерживают вращение домашнего экрана (и я не говорю о вращении например, Activity на основе ориентации устройства, а о вращении домашнего экрана сам) соотношение размеров и аспект виджета немного меняется при переходе от пейзажа к портрету и наоборот ... т. е. фиксированный размер не поддерживается.

Итак, мой виджет должен быть в состоянии определить, когда домашний экран поворачивается и извлекает новое изображение (или, по крайней мере, загружает другое предварительно загруженное изображение).

Я не могу для жизни меня разобраться, возможно ли и как это возможно. Любые подсказки?

+0

http://stackoverflow.com/questions/2435548/how-to-detect-orientation-change-in-home-screen-widget – codevscolor

+0

Спасибо за downvoting @andro_abc, но на самом деле я не вижу ответа, который работает в этом потоке – drmrbrewer

+0

okey..I не запустил его ... может кто-то еще :) – codevscolor

ответ

1

Используйте метод Activity onConfigurationChanged. Смотрите следующий код:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 

// Checks the orientation of the screen 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
} 
} 

Okay так и для виджетов, которые мы должны добавить наш класс приложения, как показано ниже, и не забудьте объявить его в манифесте также метод в основном отправляет обновление вещать на все экземпляры виджета ,

public class MyApplication extends Application { 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // create intent to update all instances of the widget 
    Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidget.class); 

    // retrieve all appWidgetIds for the widget & put it into the Intent 
    AppWidgetManager appWidgetMgr = AppWidgetManager.getInstance(this); 
    ComponentName cm = new ComponentName(this, MyWidget.class); 
    int[] appWidgetIds = appWidgetMgr.getAppWidgetIds(cm); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

    // update the widget 
    sendBroadcast(intent); 
} 
} 

и в манифесте ...

<application 
android:name="yourpackagename.MyApplication" 
android:description="@string/app_name" 
android:label="@string/app_name" 
android:icon="@drawable/app_icon"> 

<!-- here go your Activity definitions --> 

+0

Вещь, я имею в виду App Widget чем действие – drmrbrewer

1

Проверить этот код работает:

myButton.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 

    int rotation = getWindowManager().getDefaultDisplay() 
     .getRotation(); 
    // DisplayMetrics dm = new DisplayMetrics(); 
    // getWindowManager().getDefaultDisplay().getMetrics(dm); 
    int orientation; 
    CharSequence text; 

    switch (rotation) { 
    case Surface.ROTATION_0: 
    text = "SCREEN_ORIENTATION_PORTRAIT"; 
    break; 
    case Surface.ROTATION_90: 
    text = "SCREEN_ORIENTATION_LANDSCAPE"; 
    break; 
    case Surface.ROTATION_180: 
    text = "SCREEN_ORIENTATION_REVERSE_PORTRAIT"; 
    break; 
    case Surface.ROTATION_270: 
    text = "SCREEN_ORIENTATION_REVERSE_LANDSCAPE"; 
    break; 
    default: 
    text = "SCREEN_ORIENTATION_PORTRAIT"; 
    break; 
    } 

    // CharSequence text = String.valueOf(orientation); 
    Toast toast = Toast.makeText(getApplicationContext(), text, 
     Toast.LENGTH_SHORT); 
    toast.setGravity(Gravity.CENTER | Gravity.CENTER, 10, 0); 
    toast.show(); 

    } 
    }); 
+0

Какова актуальность вопроса об установке OnClickListener для кнопки? – drmrbrewer

+0

он будет обнаруживать onclick не как изменение конфигурации при повороте в реальном времени и перезагрузке активности. – Androider

1

Может быть, вы могли бы компоновать изображение с прозрачным фоном. Если изображение достаточно маленькое, чтобы оно соответствовало также при повороте, вам не нужно будет повторно его извлекать.

+0

Вы уверены, что @ MZ6? Я уже переопределял 'onAppWidgetOptionsChanged', потому что я уже реагирую на изменение размера виджета на рабочем столе, для определения нового размера и для получения нового изображения. Но это, похоже, не вызвано в ответ на изменения ориентации на рабочем столе ... это для вас? – drmrbrewer

+0

Извините, неправильный ответ, 'onAppWidgetOptionsChanged' не вызывается при вращении экрана. Мой виджет не реагировал после поворота экрана и без проблем справлялся с решением 'onConfigurationChanged', после чего я решил правильно обновить приложение, поэтому я запутался. Я редактирую свой ответ и предлагаю новое решение. – MZ6

1

Вы можете прослушивать трансляцию ACTION_CONFIGURATION_CHANGED, которая отправляется системой android при изменении конфигурации устройства (ориентация, локаль и т. Д.). Согласно документации:

ACTION_CONFIGURATION_CHANGED:

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

Вы не можете получить это через компоненты, объявленные в манифесте, только , явно зарегистрировавшись для него с помощью Context.registerReceiver().

Это защищенный объект, который может быть отправлен системой.

public class YourWidgetProvider extends AppWidgetProvider { 

     @Override 
     public void onEnabled(Context context) { 
      super.onEnabled(context); 
      context.registerReceiver(mOrientationChangeReceiver,new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED)); 
     } 

     @Override 
     public void onDisabled(Context context) { 
      context.unregisterReceiver(mOrientationChangeReceiver); 
      super.onDisabled(context); 
     } 

     public BroadcastReceiver mOrientationChangeReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent myIntent) { 
       if (myIntent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { 
        if(context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
         // landscape orientation 
         //write logic for building remote view here 
         // buildRemoteViews(); 
        } 
        else { 
         //portrait orientation 
         //write logic for building remote view here 
         // buildRemoteViews(); 
        } 
       } 
      } 
     }; 
    } 
+0

Провайдер может быть уничтожен в любое время - в этом случае ваш приемник будет течь. Предположительно позже в onDisabled он также столкнется с NPE из-за того, что mOrientationChangeReceiver имеет значение null для нового экземпляра провайдера. Виджет приложения - это временный контекст, поэтому зарегистрированный приемник не подходит в этой ситуации. – Tom

1

Вы можете проверить его с помощью виджетов ширина и высота, как это сделано в следующем фрагменте кода:

WindowManager wm; 
Display ds; 
public boolean portrait; 

public void checkOrientation() { 
    wm = getWindowManager(); 
    ds=wm.getDefaultDisplay(); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    checkOrientation(); 
    if (ds.getWidth() > ds.getHeight()) { 
     // ---landscape mode--- 
     portrait = false; 
    } else if (ds.getWidth() < ds.getHeight()) { 
     // ---portrait mode--- 
     portrait = true; 
    } 
} 
7

Используйте ниже код для определения ориентации: -

View view = getWindow().getDecorView(); 
    int orientation = getResources().getConfiguration().orientation; 

    if (Configuration.ORIENTATION_LANDSCAPE == orientation) { 
     relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.log_landscape)); 
     imageview_Logo.setImageResource(R.drawable.log_landscape_2); 
     Log.d("Landscape", String.valueOf(orientation)); 
     //Do SomeThing; // Landscape 
    } else { 
     relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.login_bg)); 
     imageview_Logo.setImageResource(R.drawable.logo_login); 
     //Do SomeThing; // Portrait 
     Log.d("Portrait", String.valueOf(orientation)); 
    } 
0
View view = getWindow().getDecorView(); 
int orientation = getResources().getConfiguration().orientation; 

if (Configuration.ORIENTATION_LANDSCAPE == orientation) { 
    relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.log_landscape)); 
    imageview_Logo.setImageResource(R.drawable.log_landscape_2); 
    Log.d("Landscape", String.valueOf(orientation)); 
    //Do SomeThing; // Landscape 
} else { 
    relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.login_bg)); 
    imageview_Logo.setImageResource(R.drawable.logo_login); 
    //Do SomeThing; // Portrait 
    Log.d("Portrait", String.valueOf(orientation)); 
} 
Смежные вопросы