[英]How to save state of layout in fragment android
我正在使用視圖分頁器處理選項卡布局,但遇到了一個問題,我不確定如何解決此問題,我在網上搜索過,但沒有發現有用的方法。
我無法拍攝視頻,因此拍攝了屏幕截圖:
I am on tab 1,
I enter in a name and press enter button
layout 1 visiblity is view.Gone and layout 2 is view.visible
I swipe/click to tab 2
I swipe/click to tab 3
when I swipe/click to tab 1
I expect layout visiblity to be view.visible and layout 1 to be view.gone
instead the app does not save the state at which I left
and goes back showing layout 1
問題:我有3個選項卡,當前選項卡2和3是空的,並且正在使用選項卡1。對於選項卡1,我放置了兩種布局,並使用可見性功能基於if-else語句顯示/隱藏選項卡。 第一種布局包含帶有按鈕的edittext字段,並且暫時,選項卡1的第二種布局為空。 if-else語句檢查用戶是否在布局1中使用其名稱書寫,如果是,則將使布局1 View.GONE可見,並使選項卡2 View.VISIBLE。
但是,當用戶輸入了正確的名稱並且應用程序對其進行了驗證時,它將轉到布局2,但是當用戶通過滑動或單擊選項卡2或3轉到然后回到選項卡1時,布局1進入了布局1。再次回到頂部,布局2消失了。
我想做的是,如果該應用程序已經過驗證並且在選項卡1中顯示了布局2,那么我希望該應用程序保存此狀態,並且如果用戶更改了選項卡並返回到選項卡1,則我希望布局2為顯示而不是1。
選項卡1的布局是:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/layout1"
android:visibility="gone">
<EditText
android:id="@+id/entered"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:textColor="#fff"
android:background="?attr/colorPrimary"
android:text="Welcome"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/layout2"
android:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="1dp"
android:orientation="vertical">
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="100dp"
android:orientation="vertical">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:textColor="#000000"
android:hint="Your Name"/>
<Button
android:id="@+id/enter"
android:textColor="#fff"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:background="?attr/colorPrimary"
android:text="Enter" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
我為驗證用戶輸入而編寫的if語句,如果文本為“ name”,則當前僅進入布局2:
if (name.getText().toString().equals("name")){
layout1.setVisibility(View.GONE);
layout2.setVisibility(View.VISIBLE);
}else {
layout1.setVisibility(View.VISIBLE);
layout2.setVisibility(View.GONE);
}
對冗長的帖子感到抱歉,我不確定解釋問題的最佳方法。 如果我的帖子不清楚,我想做的是將片段布局的狀態保存在選項卡1中,因此當用戶將選項卡更改為例如選項卡2或3並返回到選項卡1時,我希望顯示的布局為他們離開了標簽1進行顯示。
如果我的問題/帖子不清楚,請提前告知我,謝謝,我希望我已經正確地解釋了自己。
編輯:
全局變量:
public MenuItem settings;
if (name.getText().toString().equals("name")){
layout1.setVisibility(View.GONE);
layout2.setVisibility(View.VISIBLE);
settings.setEnabled(true);
}else {
layout1.setVisibility(View.VISIBLE);
layout2.setVisibility(View.GONE);
settings.setEnabled(false);
}
編輯2
public class FragmentA extends Fragment {
public boolean shouldShowItem = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (name.getText().toString().equals("name")){
layout1.setVisibility(View.GONE);
layout2.setVisibility(View.VISIBLE);
shouldShowItem = true;
}else {
layout1.setVisibility(View.VISIBLE);
layout2.setVisibility(View.GONE);
shouldShowItem = false;
}
return inflater.inflate(R.layout.fragmenta, container, false);
}
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (shouldShowItem)
menu.getItem(item_index).setEnabled(false);
return true;
}
您可以使用
ViewPager.setOffscreenPageLimit(int offset)
在您的情況下,您想指定2,這樣當您在第三頁上時,第一頁不會被破壞,反之亦然。
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
關於菜單:
看一下API
public boolean onPrepareOptionsMenu (Menu menu)
准備要顯示的屏幕標准選項菜單。 在顯示菜單之前,每次顯示菜單時都會調用此方法。 您可以使用此方法有效地啟用/禁用項目,或者以其他方式動態修改內容。
因此,您應該在“活動”中進行處理。
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (shouldShowItem)
menu.getItem(item_index).setEnabled(false);
return true;
}
進行更改時,您需要致電
invalidateOptionsMenu()
菜單將重新繪制
給您的ViewPager內存:1。
MyAdapter mAdapter= new MyAdapter(getActivity().getSupportFragmentManager());
mAdapter.contents.add(new Fragment1());
mAdapter.contents.add(new Fragment2());
mAdapter.contents.add(new Fragment3());
mPager.setAdapter(mAdapter);
class MyAdapter extends FragmentStatePagerAdapter { String[] pageTitle = {"Dummy 1", "Dummy 2", "Dummy 3"}; public JantriPagerAdapter(FragmentManager fm) { super(fm); } ArrayList<Fragment> contents = new ArrayList<>(); @Override public Fragment getItem(int position) { return contents.get(position); } @Override public int getCount() { return 3; } @Override public CharSequence getPageTitle(int position) { return pageTitle[position]; } }
現在創建三個片段名稱
Fragment1類擴展Fragment {
}。 。
現在,您的狀態已自動保存
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.