2016-01-29 119 views
1

我正在使用视图分页器的标签布局,并遇到了问题,我不知道如何解决这个问题,我在网上搜索,但没有发现任何有用的东西与...合作。如何保存片段的布局状态android

我是不是能够采取视频,这样反而把截图:

enter image description here 这些屏幕截图的场景:

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字段,暂时为tab 1的第二个布局为空。 if-else语句检查用户是否在布局1中写入了他们的名字,如果是,它将使布局1 View.GONE可见,并使制表符2 View.VISIBLE。

但是,当用户使用正确的名称进行了写入并且应用已验证它时,它会转到布局2,但是当用户通过滑动或单击标签2或3并转到标签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语句我写来验证用户输入的,目前它只会继续布局2,如果文字为'name':

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); 

       } 

组织编写

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; 
    } 
+0

这将取决于适配器您正在使用ViewPager你应该使用FragmentStatePagerAdapter其保存object.OnPause和方法的onResume的状态呼吁FragmentStatePagerAdapter –

+0

我适配器使用只有getitem和getcount – Henry

+0

请你直接给我/给我一个适配器实现onpause和onresume的例子 – Henry

回答

1

您可以使用

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() 

和菜单将被重绘

+0

我是否在mainactivity,view pager类或我的片段1类中定义了这个,或者将这个工作定义到另一个选项卡而不是滑动。 – Henry

+0

取决于你在哪里创建它,在你的主要活动中,我假设 – Shahar

+0

谢谢,我现在就试试看,并让你知道 – Henry

1

给内存给你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]; 
         } 
        } 
    
  • 现在创建三个片段名称

    类片段1延伸片段{

    } 。 。

  • 现在你的状态会自动保存

  • +0

    应设置偏移页面。 – Shahar

    +0

    没关系,如果每个片段包含图像,那么存在OEM的可能性以及是否必须创建超过3个片段。 –