如何在运行时将片段的屏幕方向锁定为横向

How to lock the screen orientation of the fragment to landscape at runtime

我有一个 activity,其 ist 片段设置为正常的纵向方向,但在加载第二个片段时,我需要将第二个片段的方向锁定为横向。可以吗?

这是我的java片段class

public class DeputationsFragment extends Fragment implements AdapterView.OnItemSelectedListener{
    LinearLayout ll;
    RecyclerView recyclerView;
    SessionManager sessionManager;
    CheckBox checkBox;
    Spinner reportType;
    String[] reportTypes,reportCodes;
    String reportCode;




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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        sessionManager=SessionManager.NewInstance(getActivity());
        ll=(LinearLayout)view.findViewById(R.id.ll1);
        recyclerView=(RecyclerView)view.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        checkBox=(CheckBox)view.findViewById(R.id.sno);
        reportType=(Spinner)view.findViewById(R.id.spin_report);
        reportType.setOnItemSelectedListener(this);
        if(Constants.isOnline())
        {
            getTypes();
        }

    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        reportCode=reportCodes[i];
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }


    private void getTypes()
    {
        AsyncHttpClient client=new AsyncHttpClient();
        String url=getResources().getString(R.string.urlReportType);
        Constants.showProgress(getActivity());
        client.get(url, new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                Constants.dismissProgress();
                try {
                    int p1 = responseString.indexOf(">"); Constants.dismissProgress();
                    Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
                    int p2 = responseString.lastIndexOf("<");
                    String r = responseString.substring(p1 + 1, p2);
                    p1 = r.indexOf(">");
                    r = r.substring(p1 + 1, r.length());
                    JSONArray jsonArray = new JSONArray(r);
                    reportTypes = new String[jsonArray.length()];
                    reportCodes = new String[jsonArray.length()];
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        reportTypes[i] = (jsonObject.getString("Name"));
                        reportCodes[i] = (jsonObject.getString("Value"));
                    }
                    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, reportTypes);
                    arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    reportType.setAdapter(arrayAdapter);
                    reportType.setSelection(0);
                    reportCode = reportCodes[0];
                    getDeputations();

                } catch (Exception e) {
                    Constants.dismissProgress();
                    Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
                }
            }
        });
        }

    void getDeputations()
    {
        Constants.showProgress(getActivity());
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        String url=getResources().getString(R.string.urlDeputationRequest);
        params.put("DistrictCode","ydRRTTxkdt6Trx91pX1+cA==");
        params.put("ReportType","1");
        client.get(url, params, new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                try {
                    Constants.dismissProgress();
                    int p1 = responseString.indexOf(">");
                    int p2 = responseString.lastIndexOf("<");
                    String r = responseString.substring(p1 + 1, p2);
                    p1 = r.indexOf(">");
                    r = r.substring(p1 + 1, r.length());
                    JSONArray jsonArray = new JSONArray(r);
                    RecyclerDeputations recyclerDeputations=new RecyclerDeputations(jsonArray,getActivity());
                    ll.setVisibility(View.VISIBLE);
                    recyclerView.setAdapter(recyclerDeputations);
                    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

                }
                catch (Exception e)
                {

                }
            }
        });
    }


}

这是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/ll"
        android:background="@color/colorAccent"
        android:layout_marginTop="10dp"
        android:weightSum="4">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1.7"
            android:gravity="right"
            android:padding="3dp"

            android:text="Report Type"
            android:textStyle="bold" />

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="2.3"
            android:gravity="left"
            android:padding="3dp"
            android:background="@color/white"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp">
            <Spinner
                android:id="@+id/spin_report"
                android:layout_width="match_parent"
                android:popupBackground="@color/white"
                android:gravity="left"
                android:layout_height="match_parent"
                android:textSize="8sp"
                android:scrollbars="horizontal"/>
        </RelativeLayout>
    </LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="8.5"
    android:background="#386FA5"
    android:id="@+id/ll1"
    android:orientation="horizontal">


    <CheckBox
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1.3"
        android:gravity="center_vertical"
        android:layout_gravity="start"
        android:text="All"
        android:background="@drawable/borders"
        android:id="@+id/sno"/>

    <TextView
        android:layout_width="0dp"
        android:text="S.No."
        android:gravity="start"
        android:layout_gravity="start"
        android:background="@drawable/borders"
        android:id="@+id/serial"
        android:textSize="12sp"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight=".5" />
    <TextView

        android:layout_width="0dp"
        android:text="Name"
        android:id="@+id/name"
        android:gravity="start"
        android:layout_gravity="start"
        android:textSize="12sp"
        android:background="@drawable/borders"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight="1" />
    <TextView

        android:layout_width="0dp"
        android:id="@+id/from"
        android:gravity="start"
        android:textSize="12sp"
        android:layout_gravity="start"

        android:text="From"
        android:background="@drawable/borders"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight="1.4" />
    <TextView

        android:layout_width="0dp"
        android:id="@+id/to"
        android:text="To"
        android:gravity="start"
        android:textSize="12sp"
        android:layout_gravity="start"
        android:background="@drawable/borders"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight="1.3" />

    <TextView

        android:layout_width="0dp"
        android:id="@+id/req_date"
        android:text="Request Date"
        android:gravity="start"
        android:textSize="12sp"
        android:layout_gravity="start"
        android:background="@drawable/borders"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight="1" />

    <TextView

        android:layout_width="0dp"
        android:id="@+id/pending"
        android:text="Pending With"
        android:gravity="start"
        android:textSize="12sp"
        android:layout_gravity="start"
        android:background="@drawable/borders"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight="1" />
    <TextView

        android:layout_width="0dp"
        android:id="@+id/remarks"
        android:text="Remarks"
        android:gravity="start"
        android:textSize="12sp"
        android:layout_gravity="start"
        android:background="@drawable/borders"
        android:padding="3dp"
      android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"/>
</LinearLayout>

在您的 onCreate 上尝试以编程方式在您的 activities or fragments 上设置 Landscape

Activity

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

片段

在您的 java 中的 rootView 之后添加此行

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Orientation 属性符合 activity,因此您可以仅为包含片段的 activity 声明方向,以便它处于横向状态,其余活动将保持原样。

所以你需要在每个片段的onCreateView中设置方向 请检查以下代码:

片段A

 public class FragmentA extends Fragment {


        @Override

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

            View view = inflater.inflate(R.layout.fragment_a, container, false);
            changeFragmentOrientation();


            return view;

        }

    }

public void changeFragmentOrientation(){
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

片段B

public class FragmentB extends Fragment {


            @Override

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

                View view = inflater.inflate(R.layout.fragment_b, container, false);
                changeFragmentOrientation();


                return view;

            }

        }

    public void changeFragmentOrientation(){
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

在第二个片段中覆盖函数 setUserVisibleHint() 然后使用下面的代码

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser) {
        Activity curActivity = getActivity();
        if(curActivity != null){ 
             curActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         }
     }
}

这将是最好的选择。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
    Activity a = getActivity();
    if(a != null)     a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 }
}

祝你的项目好运:)

我自己实现了相同的功能。我的应用程序被锁定为除一个片段之外的所有片段的纵向模式。为了实现正确的功能,我将 android:screenOrientation="nosensor" 用于 activity(在 Manifest 文件中)以防止由于用户旋转设备而导致方向改变。

我还使用 android:configChanges="keyboardHidden|orientation|screenSize" 来防止 activity 在方向改变时重新启动。否则,很容易陷入 activity 重新开始的循环,进入正确的片段并再次改变方向,重复。

在 Fragment 的 onResume() 方法中我调用 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);,在它的 onPause() 中我调用 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

希望对您有所帮助!

在清单中添加 android:configChanges="keyboardHidden|orientation"

添加你的片段

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (getActivity() != null) {
        if (isViewProfileOrNot) {
            if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        }

    }

}