【问题标题】:onConfigurationChanged() is not being called on orientation changeonConfigurationChanged() 没有在方向改变时被调用
【发布时间】:2011-12-16 10:08:02
【问题描述】:

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

我已经修改了AndroidManifest.xml 文件以进行相应的方向更改,但是当我在活动中实现它时onConfigurationChanged() 不起作用。

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

所以它在纵向模式下完美运行,但是当我切换到横向模式时,graphView 没有正确放置。

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

由于我为每个方向创建了单独的main.xml 文件,因此布局的其余部分非常完美。但是由于graphView是通过程序创建的,所以没有正确放置。

我在这里做错了吗?

我刚从here读到这个:

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

任何帮助 :)

【问题讨论】:

  • .manifest 文件是什么?你的意思是AndroidManifest.xml

标签: java android orientation android-relativelayout onconfigurationchanged


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

您是否在 Activity 类中将 onConfigurationChanged 编码为 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);
    }

我的清单信息声明:

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

【讨论】:

  • 我的应用程序始终面向横向。我已经覆盖了禁用自动定位的方法。我之前在覆盖的 onConfigurationChanged 中有一些代码,但没有更多。我发布了这个,因为只有这 2 个代码添加它对我有用。
  • 不能,应用程序总是横向运行
  • 我也在使用一个名为 cocos2d-android 的库,我调用了一个实用方法来强制景观(为了安全......):github.com/ZhouWeikuan/cocos2d/blob/master/cocos2d-android/src/… theApp 是 Activity:developer.android.com/reference/android/app/…
  • 这是什么意思:如果我在清单中写入 android:screenOrientation="landscape" 然后以纵向模式启动应用程序,它就可以工作
  • 您之前指出的硬性要求只是市场过滤器的硬件要求。我不记得模拟器我必须尝试但这里没有。我认为它在模拟器中效果很好。我一直在寻找。
【解决方案3】:

你怎么说onConfigurationChanged()方法没有被调用?没有打印日志吗?吐司没有显示吗?

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

【讨论】:

  • 没错。日志没有被打印出来,我什至没有得到祝酒词。但是如果我不写在onCreate()中添加graphView的代码,我的graphView会怎么显示呢?所以我在onCreate() 中调用graphView 和另一个类,即onConfigurationChanged() 中的graphViewLand,但它没有被调用。
  • 如果您甚至没有看到日志,那么我的回答的第二部分是无关紧要的。我建议你看看 Sunil Kumar Sahoo 对这个问题的回答。这与您的情况更相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多