【问题标题】:Android how to prevent screen rotation for specific dialog fragmentAndroid如何防止特定对话框片段的屏幕旋转
【发布时间】:2017-02-01 18:05:04
【问题描述】:

在我的应用程序中,我的对话框片段很少。 我想要的是这个:

当一个特定的对话框片段打开并发生旋转时,我想阻止该特定片段的屏幕旋转。

另外,我希望其他片段在屏幕旋转时正常运行。

这是我想停止屏幕旋转的对话框片段的 java 代码:

public class DialogDelete extends DialogFragment implements View.OnClickListener {

    TextView textViewNaslov, textViewNote;
    ImageView mBtnClose, mBtnReturn, mBtnDelete;
    private RealmResults<Drop> mRealmResolts;
    private Realm mRealm;
    private Calendar calendar;//pravimo objekt kalendara
    private BucketPickerView_Unselected mBucketNoteTimeNonSelected; //ovo nam je drugi bucket pickerview kojeg ne mozemo mjenjati
    private Bundle argumetns;


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogTheme); //dodajemo temu koju smo napravili preko editora

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_delete, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        mBtnClose = (ImageButton) view.findViewById(R.id.btn_close_note_delete);
        mBtnReturn = (ImageButton) view.findViewById(R.id.dialog_btn_return_delete);
        mBtnDelete = (ImageView) view.findViewById(R.id.dialog_btn_delete);
        textViewNaslov = (TextView) view.findViewById(R.id.dialog_text_naslov_delete);
        textViewNote = (TextView) view.findViewById(R.id.dialog_text_note_delete);
        mBucketNoteTimeNonSelected = (BucketPickerView_Unselected) view.findViewById(R.id.bpv_date_in_note_unselected_deleted);


        argumetns = getArguments(); // ovo je bundle
        int position = argumetns.getInt("POSITION");

        textViewNaslov.setText(mRealmResolts.get(position).getWhat());
        textViewNote.setText(mRealmResolts.get(position).getWhat_note());

        long vrijeme = mRealmResolts.get(position).getWhen();//dohvacamo trenutno vrijeme iz realma

        calendar = Calendar.getInstance();// dohvacamo objekt kalendar sa masu podataka a medju njima je i DATE, YEAR, MONTH...
        calendar.setTimeInMillis(vrijeme); //postavljamo da je vrijeme ovog kalendar objekta ono koje smo dohvatili iz realma

        int date = calendar.get(Calendar.DATE); //dohvacamo iz kalendar bjekta date
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);

        mBucketNoteTimeNonSelected.update(date, month, year, 0, 0, 0);//ovo nam je za onaj drugi bucket picker view sto ne mozemo da ga mjenajmo


        mBtnClose.setOnClickListener(this);
        mBtnReturn.setOnClickListener(this);
        mBtnDelete.setOnClickListener(this);

    }

    //Pozivamo iz activity prilikom klika i saljemo ove podatke koje koristimo onda ovdje
    public void setChangeDeleteListener(ChangeNoteListener mChangeNoteListener, RealmResults<Drop> realmResults, Realm realm) {
        mRealmResolts = realmResults;
        mRealm = realm;
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        int position = argumetns.getInt("POSITION");


        switch (id) {
            case R.id.btn_close_note_delete:
                dismiss();
                break;
            case R.id.dialog_btn_return_delete:
                mRealm.beginTransaction();
                mRealm.copyToRealm(mRealmResolts.get(position)).setDeleted(false);
                mRealm.commitTransaction();

                Log.d("Petarkaracic", "onClick: Ovo je u dilaog delete ");
                dismiss();
                break;
            case R.id.dialog_btn_delete:
                mRealm.beginTransaction();
                mRealmResolts.deleteFromRealm(position);
                mRealm.commitTransaction();
                Log.d("Petarkaracic", "onClick: Ovo je u dilaog delete ");
                dismiss();
                break;
        }
    }
}

【问题讨论】:

    标签: android orientation android-dialogfragment screen-orientation dialogfragment


    【解决方案1】:

    在你想锁定屏幕旋转的DialogFragment类中设置以下标签

    @Override public void onResume() {
      super.onResume();
      //lock screen to portrait
      getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    
    @Override public void onPause() {
      super.onPause();
      //set rotation to sensor dependent
      getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }
    

    【讨论】:

      【解决方案2】:

      在你的片段中添加这一行

       Settings.System.putInt( getActivity().getContentResolver(), Settings.System.ACCELEROMETER_ROTATION,  0); 
        //change 0 to 1 to enable screen rotation
      

      您可能需要添加权限

      <uses-permission android:name="android.permission.WRITE_SETTINGS" />
      

      您可能需要为此添加运行时权限

      【讨论】:

      • 感谢您的回答,但我接受了您的回答,不知何故它更干净,更容易。但是,我给你加分
      猜你喜欢
      • 2011-11-25
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多