【问题标题】:turning from portrait to landscape doupled data从纵向到横向翻倍数据
【发布时间】:2018-03-22 12:28:57
【问题描述】:

我有一个包含一个包含 recyclerview 片段的活动,当我以纵向查看应用程序时,它工作正常,但是当我转向横向数据时,数据翻了一番,这意味着当我滑动它时我有一个 recyclerview,我在它下面看到另一个。

活动代码

public class DailyAzkaar extends AppCompatActivity {
    Toolbar toolbar;
    SharedPreferences settings;
    String locale;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_azkaar);
        settings = getSharedPreferences("MyPrefs", 0);
        locale = settings.getString("locale", "en-US");
        Locale.setDefault(Locale.forLanguageTag(locale));
        Configuration config = new Configuration();
        config.setLocale(Locale.forLanguageTag(locale));
        //config.locale = locale;
        getResources().updateConfiguration(config,getResources().getDisplayMetrics());
        toolbar=(Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        DailyAzkaarFragment dailyAzkaarFragment=new DailyAzkaarFragment();
        fragmentTransaction.add(R.id.fragment_container,dailyAzkaarFragment);
        fragmentTransaction.commit();
    }
    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this,"onResume",Toast.LENGTH_SHORT).show();
    }
}

这是片段的代码

public class DailyAzkaarFragment extends Fragment implements ItemClickListener {
    ArrayList<AzkarForm> list;
    RecyclerView rv;
    int activity;
    SharedPreferences settings;
    Boolean[] favourite=new Boolean[28];
    Boolean[] favourite_evening=new Boolean[27];
    RecyclerView.LayoutManager layoutManager;
    RecyclerFavouriteAdapter adapter;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.daily_azkaar_fragment,container, false);
        rv = (RecyclerView) view.findViewById(R.id.recyclerviewcard);
        activity = getActivity().getIntent().getIntExtra("activity", 3);
        AzkaarData azkaarData=new AzkaarData(getActivity());
        settings = getActivity().getSharedPreferences("MyPrefs", 0);
        if (settings.getBoolean("is_first_time", true)) {
            //the app is being launched for first time, do something
            Log.d("TAG", "First time");
            settings.edit().putBoolean("is_first_time", false).commit();
            storeArray(favourite,"fav",false,getActivity());
            storeArray(favourite_evening,"fav_evening",false,getActivity());
        } else {
            //second time launch..
            favourite=loadArray("fav",getActivity());
            favourite_evening=loadArray("fav_evening",getActivity());
            for(int i=0;i<favourite.length;i++)
                Log.d("msg ",String.valueOf(favourite[i]));
        }
        if(activity == 1)
            list=azkaarData.getArrayListData(favourite,activity);
        else
            list=azkaarData.getArrayListData(favourite_evening,activity);
        layoutManager=new LinearLayoutManager(getActivity());
        rv.setLayoutManager(layoutManager);
        rv.setHasFixedSize(true);
        adapter=new RecyclerFavouriteAdapter(list,activity,getActivity());
        rv.setAdapter(adapter);
        adapter.setClickListener(this);
        return view;
    }
    public boolean storeArray(Boolean[] array, String arrayName,boolean b, Context mContext) {
        settings = mContext.getSharedPreferences("MyPrefs", 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt(arrayName +"_size", array.length);
        for(int i=0;i<array.length;i++) {
            editor.putBoolean(arrayName + "_" + i, b);
            array[i]=b;
        }
        return editor.commit();
    }
    public Boolean[] loadArray(String arrayName, Context mContext) {
        settings = mContext.getSharedPreferences("MyPrefs", 0);
        int size = settings.getInt(arrayName + "_size", 0);
        Boolean array[] = new Boolean[size];
        for(int i=0;i<size;i++)
            array[i] = settings.getBoolean(arrayName + "_" + i, true);
        return array;
    }
    @Override
    public void onClick(View view, int position) {
        if(view.getId()==R.id.cardview) {
            //AzkarForm azkarForm = list.get(p);
            Intent intent = new Intent(getActivity(), DetailsActivity.class);
            intent.putExtra("position", position);
            if(activity == 1) intent.putExtra("activity", 3);
            else intent.putExtra("activity", 4);
            this.startActivity(intent);
        }
    }
}

【问题讨论】:

  • 请把你的代码过去。
  • 我为活动和片段添加了代码

标签: android android-recyclerview fragment landscape


【解决方案1】:

当 Android 中屏幕的方向发生变化时,Activity 通常会被销毁并重新创建。娱乐可能会导致一些异常。为了解决这个问题,您需要保存活动(或片段或任何东西)的状态并在重新创建活动时恢复它。您应该执行以下操作

public void onCreate(Bundle savedInstanceState) {
    ...
    if (savedInstanceState != null) {
        //Restore the fragment's instance
        mContent = getSupportFragmentManager().getFragment(savedInstanceState, "myFragmentName");
        ...
    }
    ...
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Save the fragment's instance
    getSupportFragmentManager().putFragment(outState, "myFragmentName", mContent);
}

mContent是一个Fragment,对activity中当前fragment实例的引用。我希望这会有所帮助。

【讨论】:

  • 我正在尝试,但它保存的InstanceState 总是为空
  • 问题可能是您没有为 XML 中的片段声明 android:id(我没有提及)。 Android 需要 ID 或 TAG 来识别存储的片段并复制其中的所有元素。 &lt;fragment android:id="@+id/your_id" .../&gt; 也是如此
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 2012-10-12
  • 2017-07-27
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多