gpt4 book ai didi

java - ViewPager,滚动选项卡 + 滑动

转载 作者:行者123 更新时间:2023-12-01 14:14:23 25 4
gpt4 key购买 nike

我有一些选项卡,其中有一些 View ,例如EditTextCheckBoxRadioButton等。并使用ViewPager我在这些选项卡之间滑动。

这是我的代码:

activity_main.xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<!--
This title strip will display the currently visible page title, as well as the page
titles for adjacent pages.
-->

<android.support.v4.view.PagerTitleStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textColor="#fff" />

</android.support.v4.view.ViewPager>

MainActivity.java

public class MainActivity extends FragmentActivity {

/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
* will keep every loaded fragment in memory. If this becomes too memory
* intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;

/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;

private static DBManager dbManager;
private static SharedPreferences myPrefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

dbManager = new DBManager();

try {
DBManager.init(getApplicationContext());
} catch (SQLException e) {
Log.e("SQLException: ", e.toString());
}

// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {

}

@Override
public void onPageSelected(int i) {
Log.i("Page", "" + i);
// Fragment frag = mSectionsPagerAdapter.getPrimaryItem();
// View v = frag.getView();
// if(v != null)
// Log.i("mda", "haaa");

}

@Override
public void onPageScrollStateChanged(int i) {
Log.i("mda", "hu");
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private Fragment currentFragment;

public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}

public Fragment getPrimaryItem(){
return currentFragment;
}


@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
return fragment;
}

@Override
public int getCount() {
// Show 3 total pages.
return 5;
}

@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
case 2:
return getString(R.string.title_section3).toUpperCase(l);
case 3:
return getString(R.string.title_section4).toUpperCase(l);
case 4:
return getString(R.string.title_section5).toUpperCase(l);
}
return null;
}

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
currentFragment = (Fragment)object;
}
}

/**
* A dummy fragment representing a section of the app, but that simply
* displays dummy text.
*/
public static class DummySectionFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public static final String ARG_SECTION_NUMBER = "section_number";

public DummySectionFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));

return rootView;
}
}
}

fragment_main_dummy.xml 1 个选项卡 xml 示例

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity$DummySectionFragment"
android:orientation="vertical">

<TextView
android:id="@+id/section_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tag="Mda"/>

<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/field1"
android:tag="Muda"
android:text="lalalala"/>

<CheckBox
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="New CheckBox"
android:id="@+id/checkBox"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="76dp"
android:text="New Text"
android:id="@+id/textView"
android:layout_gravity="left|center_vertical"
android:layout_marginLeft="158dp"/>

<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New RadioButton"
android:id="@+id/radioButton"
android:layout_gravity="left|center_vertical"/>

<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New RadioButton"
android:id="@+id/radioButton2"
android:layout_gravity="left|center_vertical"/>

<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New RadioButton"
android:id="@+id/radioButton3"
android:layout_gravity="left|center_vertical"/>

</LinearLayout>

问题:

我想要做的是在更改页面后收集 View 中的所有输入。当用户更改 ViewPage 并转到第二个选项卡时,我需要获取他在前一个选项卡中写入的所有信息。

我可以通过设置primaryItem来获取当前页面 fragment 的 View ,但无法获取上一个选项卡的 View 。怎么办?

提前致谢。

最佳答案

给你一些东西,

保存普通 View 的状态必须手动完成,唯一能够为您保存状态的 View 是 TextView 及其 subview 。因此,由于 EditText 是 TextView,因此这是可能的。

您想尝试的属性:

setFreezesText() 或 android:freezesText for xml。

(注释仅在 TextView 有 ID 时才有效)

此控制除了动态状态(例如光标位置)之外,该 TextView 在卡住为冰柱时是否保存其整个文本内容。默认情况下这是 false,不保存文本。如果 TextView 中的文本未保存在持久存储中的其他位置(例如内容提供程序中),则设置为 true,以便以后解冻 View 时用户不会丢失数据。

Android 文档引用: http://developer.android.com/reference/android/widget/TextView.html#setFreezesText%28boolean%29

您可以尝试的其他方法是更改​​ View 分页器缓存的 View 数限制。这样做可以使更多 View 保持 Activity 状态,而无需重新创建它们,因此它们内部的数据不会丢失。

您可以通过使用 View 寻呼机的以下方法来实现此目的:

setOffScreenPageLimit(int)

Android 文档引用: http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

现在可以通过多种不同的方式保存所有选项卡中的所有数据,例如,您可以在 getItem 方法中使用 args Bundle 来存储第一个选项卡的数据并将其传递到第二个选项卡。

 @Override
public Fragment getItem(int position) {

Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putString("key",myTextView.getText().toString());
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
return fragment;
}

现在,虚拟 fragment 的新实例将使用键“key”存储 TextView 中的文本,您可以使用 fragment 的 getArguments() 方法检索它。

例如:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

//here is your arguments
Bundle bundle=getArguments();

//here is your list array
String myString=bundle.getString("key");
}

您还可以使用 SharedPreferences 来存储数据,然后在需要将其存储到数据库中时检索它。

这可能有点笼统,但它对共享首选项有一些很好的引用。

http://developer.android.com/guide/topics/data/data-storage.html

请告诉我这个答案是否有帮助,或者您需要更多帮助。

编辑:

好吧,我想我找到了一种可以实现您想要做的事情的方法,它有点黑客,但它会完成工作,直到找到更好的解决方案。如果有时间的话我可能会进一步研究一下。

但现在,您可以执行以下操作。

方法 onPageSelected(intposition) 是完成大部分工作的地方。

@Override
public void onPageSelected(int position) {
//This makes sure we get the previous position in the view pager and also
//makes sure we don't go to -1 when you swipe back to the 0th position.

//The problem here is if you are using action bar tabs, the user can also select the third tab, from the first tab and the index will be pointing to the second tab. I did not go out of my way to handle this case. But with a few checks you can handle the cases.

//Also without proper checks, swiping backwards will be an issue, so adding those cases may also be necessary.
int index = position == 0 ? position : position - 1;


View view = mViewPager.getChildAt(index);

// View at this point is the previous view in your view pager
// and you can access your textviews in the following way.

TextView myTextView = (TextView) view.findViewById(R.id.section_label);


// If using action bar tabs, set the selected tab.
mActionBar.setSelectedNavigationItem(position);
}

就像我说的,它非常hacky并且涉及一些检查条件,但它会起作用。当我有时间时,我会考虑寻找一种更优雅的方法来执行此操作,并将其发布回此线程。

祝你好运

关于java - ViewPager,滚动选项卡 + 滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com