首页 文章

以横向模式启动片段

提问于
浏览
0

在此先感谢您的帮助 . 我正在尝试加载我的一个片段,它通过调用从横向模式的drawerlayout活动加载

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

片段以横向模式加载 . 我还有一个可运行的线程,它在片段绑定到后台服务后从onStart()开始,并且runnable被杀死onStop() .

private final Runnable initCommands = new Runnable() {
    @Override
    public void run() {
        Log.d(TAG,"running thread");
        if(isServiceBound) {

            //some code...
            new Handler().postDelayed(initCommands,800);
        }
    }
};

在片段绑定服务后启动runnable:

private ServiceConnection serviceConn = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        ELMScanner.ELMScannerServiceBinder serviceBinder = (ELMScanner.ELMScannerServiceBinder) binder;
        scanner = serviceBinder.getService();
        isServiceBound = true;
        if (scanner.isConnected()) {

            Log.d(TAG,"init commands");

            new Handler().post(initCommands);
        }
    }

    public void onServiceDisconnected(ComponentName className) {
        isServiceBound = false;
        scanner.resetCommands();
    }
};

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG,"onStop");
    FRAGMENT_RUNNING = 0;
    if (isServiceBound) {
        getActivity().getApplicationContext().unbindService(serviceConn);
        Log.d(TAG,"unbinding service");
        isServiceBound = false;
        scanner.resetCommands();
    }

}

我面临的问题来自setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) . 由于某种原因,此方法重新加载片段而不是杀死第一个线程,因此有两个线程运行的实例 .

07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ on Attach
07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ onCreate
07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ onCreatView
07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ onstart
07-30 18:38:53.062    2940-2940/com.package/FuelFragment﹕ onStop
07-30 18:38:53.062    2940-2940/com.package/FuelFragment﹕ on Detach
07-30 18:38:53.070    2940-2940/com.package/ApplicationPackageManager﹕ cscCountry is not German : THR
07-30 18:38:53.070    2940-2940/com.package/FuelFragment﹕ on Attach
07-30 18:38:53.070    2940-2940/com.package/FuelFragment﹕ onCreate
07-30 18:38:53.242    2940-2940/com.package/FuelFragment﹕ onCreatView
07-30 18:38:53.250    2940-2940/com.package/FuelFragment﹕ onstart
07-30 18:38:53.257    2940-2940/com.package/FuelFragment﹕ init commands
07-30 18:38:53.257    2940-2940/com.package/FuelFragment﹕ init commands
07-30 18:38:53.328    2940-2940/com.package/FuelFragment﹕ running thread

我的问题:是否有一个替代setRequestedOrientation()不重载片段?

谢谢 .

解:

万一你想知道如何解决这个问题 .

在onStart()方法中,添加条件

int orientation = getResources().getConfiguration().orientation;

    if (orientation == 2) {
        Intent serviceIntent = new Intent(getActivity(), ELMScanner.class);
        getActivity().getApplicationContext().bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
    }

这将确保片段仅绑定到服务并在横向模式下启动时运行该线程 . 还要确保添加

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

}

@Override
public void onDetach() {
    super.onDetach();
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

}

1 回答

  • 0

    AFAIK,没有 . 方向更改需要重新启动Activity / Fragment,以便系统有机会重新加载所有资源 .

    docs到setRequestedOrientation:

    更改此活动的所需方向 . 如果活动当前处于前台或以其他方式影响屏幕方向,则将立即更改屏幕(可能导致重新启动活动) . 否则,这将在下次活动可见时使用 .

    您的代码应该能够处理被销毁和重新创建而不会搞乱并创建两个线程 . 目前还不清楚你要完成什么,所以我不能给你任何进一步的建议,但是正确处理活动生命周期是必要的 .

相关问题