簡體   English   中英

如何在fragment android中保存布局狀態

[英]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);
  1. 這是您的傳呼機的適配器
 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]; } } 
  1. 現在創建三個片段名稱

    Fragment1類擴展Fragment {

    }。

  2. 現在,您的狀態已自動保存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM