【问题标题】:Whenever i rotate the screen it jumps to main activity screen from fragment screen每当我旋转屏幕时,它都会从片段屏幕跳转到主活动屏幕
【发布时间】:2017-05-25 06:21:09
【问题描述】:

我是 android 的初学者,我使用片段创建了应用程序。其中,当我旋转屏幕时(在片段屏幕中),它会离开片段屏幕并跳转到主活动屏幕。为什么?请帮我解决这个问题。

我的主要活动, Individualuser_Safmical.java:

public class IndividualUser_Safmical extends AppCompatActivity
         {
    FragmentManager fm;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
fm = getFragmentManager();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.i_activity_safmical);
}
 public void shopbycategory(View v) {
        fm.beginTransaction().replace(R.id.content_frame, new ShopFragment()).addToBackStack("shop").commit();

    }
}

我的片段,ShopFrgment.java:

public class ShopFragment extends Fragment {
    FragmentManager fm;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View rootview= inflater.inflate(R.layout.i_fragment_shop,container,false);
        String[] list1={"Chemicals","Pigments","Uniforms","Safety Products"};
        ListView listView= (ListView) rootview.findViewById(R.id.mainlist);
        ArrayAdapter<String> listviewadapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,list1);
        listView.setAdapter(listviewadapter);
          fm =getFragmentManager();
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(position==0){
                   fm.beginTransaction().replace(R.id.content_frame,new Chemical_Fragment()).addToBackStack("shop").commit();
                }
                if(position==1){
                fm.beginTransaction().replace(R.id.content_frame,new Pigments_Fragment()).addToBackStack("shop").commit();
                }
                if(position==2){
                 fm.beginTransaction().replace(R.id.content_frame,new Uniforms_Fragment()).addToBackStack("shop").commit();
                    }
                if(position==3){
                 fm.beginTransaction().replace(R.id.content_frame,new SafetyProducts_Fragment()).addToBackStack("shop").commit();
                }
            }
        });
        return rootview;
    }
}

【问题讨论】:

  • 这是因为在旋转屏幕上,活动被破坏并重新创建,并且您的片段没有自己的存在,而活动确实有
  • @Abdul kawee - 那我应该更正什么?
  • 查看@harsh下面的答案

标签: android android-fragments android-activity onsaveinstancestate onrestoreinstancestate


【解决方案1】:

您可以使用onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);

}

将此行添加到您的清单中

android:configChanges="keyboardHidden|orientation|screenSize"

或

您可以通过在清单中添加它来锁定您的活动以避免方向更改

android:screenOrientation="portrait"

【讨论】:

  • 我需要在fragment中写onConfigurationchanged方法吗?
  • 添加activity,检查配置是否改变,然后再次调用fragment
  • 但是当点击“按类别购物”按钮时会调用这个片段。那么我应该在我的活动中添加这个代码吗?
  • 它是一个OverRide 方法,例如onCreate 或onDestroy,所以将它添加到您的活动中的任何位置,当配置更改发生时它会自动调用
  • 最小的解决方案是将您的应用程序锁定为纵向模式,使其无法旋转并解决您的问题
【解决方案2】:

查看保存活动状态并再次恢复它的示例。您必须在那里应用您的解决方案。这是官方文档。 https://developer.android.com/guide/topics/resources/runtime-changes.html

【讨论】:

    【解决方案3】:

    @Abdul Kawee 写道

    这是因为在旋转屏幕上活动被破坏并重新创建

    他当然是对的。有两种方法可以解决这个问题:

    1. Override 你的Fragment 的onConfigurationChanged()、onSaveInstanceState() 和onRestoreInstanceState() 回调方法。
    2. 或者您可以在应用的清单文件中添加android:configChanges="keyboardHidden|orientation"。

    更多详情请看SO Answer。

    【讨论】:

    • @Abbas- 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多