onConfigurationChanged() is not being called on orientation change

*爱你&永不变心* 提交于 2019-12-24 00:43:36

问题


I saw some related questions on SO, but I'm not able to resolve my issue. I've created separate layout for PORTRAIT and LANDSCAPE mode.

I've modified the AndroidManifest.xml file for corresponding orientation change but onConfigurationChanged() is not working when I'm implementing it in activity.

Now the issue is at layout.addView(graphView, lp); in onCreate(). I've written absolute hard-coded value in GraphView class.

So it works perfectly foe PORTRAIT mode but graphView is not correctly placed when I switch to LANDSCAPE mode.

To resolve this I've created GraphViewLand class which is coded exclusively for LANDSCAPE mode. But it is not getting called from onConfigurationChanged().

Rest of the layout is coming perfectly as I've created separate main.xml file for each orientation. But since graphView is created programmatically, it is not placed properly.

Am I doing anything wrong here?

I just read this from here:

For any types of configuration changes you say that you handle there, you will receive a call to your current activity's onConfigurationChanged(Configuration) method instead of being restarted. If a configuration change involves any that you do not handle, however, the activity will still be restarted and onConfigurationChanged(Configuration) will not be called.

onCreate() method

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();

    RelativeLayout layout = (RelativeLayout) findViewById(R.id.MainLayout);

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.ALIGN_TOP, btnindex.getId());

    GraphView graphView = new GraphView(this, values, "CurrentGraph",
                horlabels, verlabels);
    layout.addView(graphView, lp);
    }

onConfigurationChanged() method

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

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

Log.v("LAND", "SCPAE");
    }
}

Any help appriciated :)


回答1:


If you create two different types of view (for landscape and portrait) in xml and you have to write logic on different types of view then donot use android:configChanges in manifest.

If you have no android:configChanges in manifest and you have different sets of layout for landscape and portrait then when you change orientation your control will come to onCreate() inside that method you can write your logic.




回答2:


Did you code onConfigurationChanged as an override in your Activity class? Basic override:

// Called on rotation. 
    // Does not call onDestroy anymore due to android:configChanges="keyboardHidden|orientation" in manifest
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
    }

My manifest declaration for info:

<activity android:name=".Slime"
                  android:label="@string/app_name"
                  android:configChanges="keyboardHidden|orientation"
                  android:screenOrientation="landscape">



回答3:


How do you say that the onConfigurationChanged() method is not called? Is the log not being printed? Isn't the toast being shown?

Secondly, you mention that the issue is at layout.addView in onCreate(). Do note that if android:configChanges is present in your manifest, then onCreate() is not called on orientation change. You need to move the piece of code that programmatically modifies the UI layout into the onConfigurationChanged() method.



来源:https://stackoverflow.com/questions/8532614/onconfigurationchanged-is-not-being-called-on-orientation-change

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!