2015-09-02 26 views
20

मेरे पास App Widget है, जो अपडेट होने पर, विजेट से मेल खाने के लिए आयाम वाली छवि प्राप्त करता है, और उस छवि को ImageView (RemoteViews के माध्यम से) में स्थान देता है। यह ठीक काम करता है।एंड्रॉइड होम स्क्रीन के घूर्णन का पता लगाएं

लेकिन उपकरणों कि होम स्क्रीन के रोटेशन का समर्थन के लिए (और मैं जैसे के रोटेशन के बारे में बात नहीं कर रहा हूँ एक Activity पर डिवाइस अभिविन्यास आधारित है, लेकिन होम स्क्रीन खुद के रोटेशन के बारे में) आयाम और पहलू अनुपात लैंडस्केप से लेकर पोर्ट्रेट तक जाने के दौरान विजेट का थोड़ा सा परिवर्तन होता है और इसके विपरीत ... यानी एक निश्चित आकार बनाए रखा नहीं जाता है।

तो, मेरे विजेट को होम स्क्रीन घूमता है, और एक नई छवि (या कम से कम एक अलग पूर्व-प्राप्त छवि लोड) को पहचानने में सक्षम होने की आवश्यकता है।

मैं के लिए मुझे के जीवन पता लगाएँ कि क्या और कैसे यह संभव है काम नहीं कर सकता। कोई सुराग?

+0

http://stackoverflow.com/questions/2435548/how-to-detect-orientation-change-in-home- स्क्रीन- widget – codevscolor

+0

@andro_abc को डाउनवॉट करने के लिए धन्यवाद लेकिन मैं वास्तव में उस उत्तर में नहीं देख सकता जो उस थ्रेड में काम करता है – drmrbrewer

+0

ओकी..मैंने इसे कम नहीं किया है .. किसी और को बी :) – codevscolor

उत्तर

1

ऑन कॉन्फ़िगरेशन गतिविधि का परिवर्तन विधि का उपयोग करें। इसलिए विगेट्स हम नीचे के रूप में हमारे आवेदन वर्ग को जोड़ने के लिए है और मत भूलना भी प्रकट में यह घोषणा करने के लिए, विधि मूल रूप से एक अद्यतन अपने विजेट के सभी उदाहरणों के लिए प्रसारण भेजता

@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(); 
} 
} 

ठीक है: निम्नलिखित कोड देखें ।

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

बात यह है कि, मैं ऐप विजेट का जिक्र कर रहा हूं एक गतिविधि के मुकाबले – 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

बटन के लिए ऑनक्लिक लिस्टनर सेट करने के सवाल की प्रासंगिकता क्या है? – drmrbrewer

+0

जब हम वास्तविक समय में घूमते हैं, और गतिविधि पुनरारंभ होता है तो यह कॉन्फ़िगरेशन परिवर्तन की तरह नहीं निकलता है। – Androider

1

शायद तुम एक पारदर्शी पृष्ठभूमि के साथ अपने चित्रों को फ्रेम सकता है। यदि घुमाए जाने पर भी छवि फिट करने के लिए पर्याप्त छोटा है, तो आपको इसे फिर से लाने की आवश्यकता नहीं होगी।

+0

क्या आप वाकई @ एमजेड 6 हैं? मैंने पहले से ही 'onAppWidgetOptionsChanged' को ओवरराइड कर दिया है क्योंकि मैं पहले से ही होमस्क्रीन पर विजेट का आकार बदलने वाले उपयोगकर्ता को प्रतिक्रिया देता हूं, नया आकार निर्धारित करने और एक नई छवि लाने के लिए। लेकिन यह होमस्क्रीन अभिविन्यास में बदलावों के जवाब में नहीं कहा जाता है ... क्या यह आपके लिए करता है? – drmrbrewer

+0

क्षमा करें, गलत उत्तर, 'onAppWidgetOptionsChanged' को स्क्रीन घुमाते समय नहीं कहा जाता है। मेरा विजेट स्क्रीन रोटेशन के बाद उत्तरदायी नहीं था और बिना किसी खुशी के 'कॉन्फ़िगरेशन चेंजेड' समाधान की कोशिश की, फिर मैंने ऐप को सही तरीके से अपडेट करने का हल किया, इसलिए मैं उलझन में आया। मैं अपना जवाब संपादित कर रहा हूं और एक नया समाधान सुझा रहा हूं – MZ6

1

आप प्रसारण ACTION_CONFIGURATION_CHANGED जो एंड्रॉयड प्रणाली द्वारा भेजा जाता है जब वर्तमान डिवाइस विन्यास (अभिविन्यास, स्थान, आदि) बदल गया है के लिए सुन सकते हैं। प्रति प्रलेखन के रूप में:

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

प्रदाता किसी भी समय नष्ट हो सकता है - जिस स्थिति में आपका रिसीवर रिसाव होगा। संभावित रूप से बाद में अक्षम होने पर यह नए प्रदाता उदाहरण के लिए mririentationChangeReceiver शून्य होने के कारण एनपीई में भी चला जाएगा। एक ऐप विजेट एक अस्थायी संदर्भ है और इसलिए एक पंजीकृत रिसीवर इस स्थिति में उपयुक्त नहीं है। – 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)); 
} 
संबंधित मुद्दे