在方向更改时未调用onConfigurationChanged()

时间:2011-12-16 10:08:02

标签: java android orientation relativelayout onconfigurationchanged

我在SO上看到了一些相关的问题,但我无法解决我的问题。 我为PORTRAIT和LANDSCAPE模式创建了单独的布局。

我修改了AndroidManifest.xml文件以进行相应的方向更改,但当我在活动中实施时,onConfigurationChanged()无效。

现在问题出在layout.addView(graphView, lp); onCreate() 。 我在GraphView类中编写了绝对硬编码值。

因此,当我切换到LANDSCAPE模式时,它对PORTRAIT模式完全有效,但是graphView没有正确放置。

为了解决这个问题,我创建了GraphViewLand类,它专门为LANDSCAPE模式编码。但它没有从onConfigurationChanged()调用。

其他布局完美无缺,因为我为每个方向创建了单独的main.xml文件。但由于graphView是以编程方式创建的,因此未正确放置。

我在这里做错了吗?

我刚刚从here了解到这一点:

对于任何类型的配置更改,您说您在那里处理,您将收到对当前活动的onConfigurationChanged(配置)方法的调用,而不是重新启动。 但是,如果配置更改涉及您未处理的任何内容,则仍会重新启动活动,并且不会调用onConfigurationChanged(Configuration)。

onCreate()方法

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()方法

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");
    }
}

任何帮助appriciated:)

3 个答案:

答案 0 :(得分:5)

如果您在xml中创建两种不同类型的视图(用于横向和纵向),并且您必须在不同类型的视图上编写逻辑,那么不要在清单中使用android:configChanges

如果清单中没有android:configChanges并且您拥有不同的横向和纵向布局,那么当您更改方向时,您的控件将转到onCreate() 在那个方法里面你可以编写你的逻辑。

答案 1 :(得分:1)

您是否在活动类中将onConfigurationChanged编码为覆盖? 基本覆盖:

// 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);
    }

我的信息清单声明:

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

答案 2 :(得分:1)

怎么说没有调用onConfigurationChanged()方法?是不是打印了日志?吐司不是出现了吗?

其次,您提到问题出现在layout.addView的{​​{1}}。请注意,如果您的清单中存在onCreate(),则在方向更改时不会调用android:configChanges。您需要将以编程方式修改UI布局的代码段移动到onCreate()方法中。