【问题标题】:Android Landscape Orientation on Fragment Resetting Shared Preferences片段重置共享首选项上的Android横向方向
【发布时间】:2015-07-26 14:34:34
【问题描述】:

我正在使用共享首选项来跟踪保存在设备上的管理代码,我注意到当我进入这个具有横向方向的特定片段时,首选项被调用两次,第二次重置为它的初始空值。这是它发生的唯一片段,我已经能够将其缩小到该行

activity.setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

是否有一种特定的正确方法可以在横向上共享偏好

这是代码

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        final Activity activity = getActivity();

        SharedPreferences sharedpreferences = activity.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
        Boolean Admin_Mode = sharedpreferences.getBoolean("AdminCode", false);
        String IPaddress = sharedpreferences.getString("IP Address", "");

        System.out.println(IPaddress);
        System.out.println(Admin_Mode);

        View rootView = inflater.inflate(R.layout.augmented_reality_view, container, false);

        ActionBar actionBar = ((ActionBarActivity)activity).getSupportActionBar();

        actionBar.hide();

        System.out.println("here");


        activity.setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        mSensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);

        mRotationVectorSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
        mMagneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);


        mSensorManager.registerListener(this, mRotationVectorSensor, 10000);
        mSensorManager.registerListener(this, mMagneticSensor, 10000);

        HeadTracker = (ToggleButton) rootView.findViewById(R.id.HeadTracker);


        return rootView;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        if (HeadTracker.isChecked() == true) {

            if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {

                SensorManager.getRotationMatrixFromVector(
                        mRotationMatrix, event.values);

                if (mRotationMatrix[2] >= 0.6 && mRotationMatrix[0] >= -0.1 && mRotationMatrix[0] <= 0.2){

                    Left = true;
                    Right = false;

                }
                else if (mRotationMatrix[2] <= -0.8 && mRotationMatrix[0] >= -0.1 && mRotationMatrix[0] <= 0.2){

                    Left = false;
                    Right = true;
                }
                else{
                    Left = false;
                    Right = false;;
                }

            }

        }

        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

            if(event.values[2] >= 390){
                MagnetButtonPressed = true;
            }
            else{
                MagnetButtonPressed = false;
            }

        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onPause()
    {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

任何建议都是史诗 :)

干杯

史蒂夫

///...... 编辑............\\\ 添加在设置片段代码中

public class Settings extends PreferenceFragment {

public SharedPreferences sharedpreferences;
public static final String MyPREFERENCES = "MyPrefs" ;

String IPaddress;
int PortNumber;
Boolean Admin_Mode;


public Settings() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    View rootView = inflater.inflate(R.layout.settings, container, false);

    getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


    final SharedPreferences sharedpreferences = getActivity().getSharedPreferences(MyPREFERENCES,Context.MODE_PRIVATE);

    IPaddress = sharedpreferences.getString("IP Address","");
    PortNumber = sharedpreferences.getInt("Port Numner", 1);
    Admin_Mode = sharedpreferences.getBoolean("AdminCode", false);

    final EditText mEdit   = (EditText)rootView.findViewById(R.id.ipaddress);
    final EditText mEdit2   = (EditText)rootView.findViewById(R.id.portnumber);
    final EditText AdminCommandBox = (EditText)rootView.findViewById(R.id.AdminCommandBox);

    mEdit.setText(IPaddress);
    String strI = Integer.toString(PortNumber);
    mEdit2.setText(strI);


    Button clickButton = (Button) rootView.findViewById(R.id.Update_Settings);
    clickButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {


            SharedPreferences.Editor editor = sharedpreferences.edit();
            editor.putString("IP Address", mEdit.getText().toString());
            editor.putInt("Port Numner", Integer.parseInt(mEdit2.getText().toString()));
            editor.commit();

            Toast.makeText(getActivity(),"Port and Ip Updated!",Toast.LENGTH_SHORT).show();


        }
    });

    final Button Authorise = (Button) rootView.findViewById(R.id.Authorise_Button);

    if (Admin_Mode == false){Authorise.setText("Authorise");}
    else if (Admin_Mode == true){Authorise.setText("Deactivate");}

    Authorise.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            if (Admin_Mode == false){

                if (AdminCommandBox.getText().toString().equals("FerasQUT123")) {

                    SharedPreferences.Editor editor = sharedpreferences.edit();
                    editor.putBoolean("AdminCode", true);
                    editor.commit();

                    Toast.makeText(getActivity(),"Code Authorised",Toast.LENGTH_SHORT).show();

                    Authorise.setText("Deactivate");

                }

                else{

                    Toast.makeText(getActivity(),"Please Enter the Correct Code",Toast.LENGTH_SHORT).show();

                }


            }
            else if (Admin_Mode == true){

                SharedPreferences.Editor editor = sharedpreferences.edit();
                editor.putBoolean("AdminCode", false);
                editor.commit();

                Toast.makeText(getActivity()," Deactivated",Toast.LENGTH_SHORT).show();

                Authorise.setText("Authorise");

            }


        }
    });


    return rootView;
}



public void onDestroy() {
    super.onDestroy();

}}

【问题讨论】:

  • 相关首选项在哪里设置?阅读偏好不能改变它的价值。我猜在读取之间发生了一些事情。
  • @Jonathan727 - 偏好设置在另一个片段中,这是唯一有问题的片段,所有其他片段都可以正常工作,但不要使用横向。我感觉这与设置方向时获取应用程序上下文有关。如果我删除方向线,它应该可以正常工作,但我需要该片段处于横向
  • 如果设备的方向已经是纵向的,是否会发生这种情况?
  • @Jonathan727 - 不,只有在设备处于横向模式时才会发生
  • 这听起来像是您的活动在横向模式下被破坏和重新创建的副作用。

标签: android android-layout android-fragments sharedpreferences android-sensors


【解决方案1】:

在共享首选项中,我在创建开始时获得了管理模式的状态,我在主活动中将其设置为 false,然后如果输入正确的代码,则在设置片段中更新它。

您的问题是您在活动的 onCreate 方法中将管理模式设置为 false。当屏幕方向改变时,Activity 将被销毁并重新创建——因此onCreate 将被再次调用,这将您的管理模式首选项设置为 false。

【讨论】:

  • @user3774031 很高兴您发现这很有帮助。作为在onCreate 中将管理模式设置为 false 的替代方法,我在想您可能会添加一个 logout 菜单项,当用户明确选择时更改此首选项它。您还可以在用户进行身份验证时将过期时间添加到另一个首选项,这样如果他们没有明确注销,他们的登录仍然会过期。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多