我使用的是ViewPager
连同FragmentStatePagerAdapter
主办三个不同的片段:
当我想Fragment1
从ViewPager
在FragmentActivity
.
有什么问题,我该如何解决?
下面是我的代码,3 Fragment classes
每个代码都嵌入了3个选项卡中的每一个ViewPager
.我有一个菜单选项.如图所示onOptionsItemSelected()
,通过选择一个选项,我需要更新当前可见的片段.要更新,我必须调用片段类中的方法.有人可以建议如何调用该方法吗?
public class MainActivity extends ActionBarActivity {
ViewPager ViewPager;
TabsAdapter TabsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewPager = new ViewPager(this);
ViewPager.setId(R.id.pager);
setContentView(ViewPager);
final ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Attaching the Tabs to the fragment classes and setting the tab title.
TabsAdapter = new TabsAdapter(this, ViewPager);
TabsAdapter.addTab(bar.newTab().setText("FragmentClass1"),
FragmentClass1.class, null);
TabsAdapter.addTab(bar.newTab().setText("FragmentClass2"),
FragmentClass2.class, null);
TabsAdapter.addTab(bar.newTab().setText("FragmentClass3"),
FragmentClass3.class, null);
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch …
Run Code Online (Sandbox Code Playgroud) 我正在使用Android中的v4兼容性ViewPager.我的FragmentActivity有一堆数据,可以在我的ViewPager中的不同页面上以不同的方式显示.到目前为止,我只有3个相同的ListFragment实例,但将来我将有3个不同的ListFragments实例.ViewPager位于垂直电话屏幕上,列表不是并排的.
现在,ListFragment上的一个按钮启动一个单独的整页活动(通过FragmentActivity),它返回并且FragmentActivity修改数据,保存数据,然后尝试更新其ViewPager中的所有视图.就在这里,我被卡住了.
public class ProgressMainActivity extends FragmentActivity
{
MyAdapter mAdapter;
ViewPager mPager;
@Override
public void onCreate(Bundle savedInstanceState)
{
...
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.viewpager);
mPager.setAdapter(mAdapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
...
updateFragments();
...
}
public void updateFragments()
{
//Attempt 1:
//mAdapter.notifyDataSetChanged();
//mPager.setAdapter(mAdapter);
//Attempt 2:
//HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentById(mAdapter.fragId[0]);
//fragment.updateDisplay();
}
public static class MyAdapter extends FragmentPagerAdapter implements
TitleProvider
{
int[] fragId = {0,0,0,0,0};
public MyAdapter(FragmentManager fm)
{
super(fm);
}
@Override …
Run Code Online (Sandbox Code Playgroud) android android-adapter android-fragments android-viewpager android-listfragment
最新信息:
我已经把我的问题缩小到了一个问题,片段管理器保留了旧片段的实例,而我的viewpager与我的FragmentManager不同步.请参阅此问题... http://code.google.com/p/android/issues/detail?id=19211#makechanges.我仍然不知道如何解决这个问题.有什么建议...
我试图调试这个很长一段时间,任何帮助将不胜感激.我正在使用FragmentPagerAdapter,它接受一个像这样的片段列表:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
...
new PagerAdapter(getSupportFragmentManager(), fragments);
Run Code Online (Sandbox Code Playgroud)
实施是标准的.我正在为Fragments使用ActionBarSherlock和v4可计算性库.
我的问题是,在离开应用程序并打开其他几个应用程序并返回后,片段将丢失其对FragmentActivity的引用(即.getActivity() == null
).我无法弄清楚为什么会这样.我试图手动设置,setRetainInstance(true);
但这没有帮助.我想当我的FragmentActivity被破坏时会发生这种情况,但是如果我在收到日志消息之前打开应用程序,这仍然会发生.有什么想法吗?
@Override
protected void onDestroy(){
Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)
适配器:
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
Run Code Online (Sandbox Code Playgroud)
我的一个碎片被剥夺了但是我很满意每一个被剥离但仍然无法工作的东西......
public class MyFragment extends Fragment implements MyFragmentInterface, OnScrollListener …
Run Code Online (Sandbox Code Playgroud) 我有一个浏览片段的viewpager.我的FragmentPagerAdapter
子类在getItem
方法中创建了一个看似浪费的新片段.是否有一个FragmentPagerAdapter
相当于convertView
在listAdapter
,使我重新使用已创建的片段?我的代码如下.
public class ProfilePagerAdapter extends FragmentPagerAdapter {
ArrayList<Profile> mProfiles = new ArrayList<Profile>();
public ProfilePagerAdapter(FragmentManager fm) {
super(fm);
}
/**
* Adding a new profile object created a new page in the pager this adapter is set to.
* @param profile
*/
public void addProfile(Profile profile){
mProfiles.add(profile);
}
@Override
public int getCount() {
return mProfiles.size();
}
@Override
public Fragment getItem(int position) {
return new ProfileFragment(mProfiles.get(position));
}
}
Run Code Online (Sandbox Code Playgroud) 我,使用带有4个选项卡的slidingTabLayout和每个选项卡的viewpager和4个片段类.
当用户点击某个按钮时,我需要在我的项目中重新加载我的一个片段(第一个标签),为此我需要为该片段添加一个标签
我的问题是:如何为其中一个viewpagers片段设置一个标签???
我的MainActivity选项卡和viewpager代码:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
CharSequence Titles[]={"???","????","????","???"};
int Numboftabs = 4;
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "??? ???? ??????", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
NavigationView navigationView = (NavigationView) …
Run Code Online (Sandbox Code Playgroud) 我不熟悉FragmentPagerAdapter
,所以这将成为我们(你)批判性地阅读描述的问题之一.
结构:我有一个FragmentPagerAdapter
(下面的代码),一次可以容纳两个片段.第一个显示书籍摘录,第二个显示书名列表.
目标:我想实现标题中描述的内容:用户可以导航到寻呼机中的第二个片段,单击标题,然后我想将用户移回第一个片段并告诉第一个片段更新文本.第一个片段有一个triggerRefresh
方法.
代码:我相信我的问题发生是因为FragmentPagerAdapter
重用/创建片段的方式(我不明白).这是我的班级:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new ExcerptsFragment();
case 1:
return new BookListFragment();
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建相关成员的方式:
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
Run Code Online (Sandbox Code Playgroud)
这就是我在我的活动中尝试过的其他内容,当我收到书名为Fragment并选择了标题的回调时:
mViewPager.setCurrentItem(0); …
Run Code Online (Sandbox Code Playgroud) android updating android-fragments android-viewpager fragmentpageradapter
我正在使用FragmentPagerAdapter和FragmentActivity来创建可滑动的片段.
我在pagerAdapter中的第一个片段看起来像这样.
public class MySummaryFragment extends CommonFragment implements OnPageChangeListener
{
private Context mContext;
private View mMyView;
LinearLayout mDetailLayout;
TextView mDateTxtView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
System.out.println("onCreateView() Market summary");
mMyView = inflater.inflate(R.layout.my_page_summary_fragment_layout, container,false);
mDetailLayout = (LinearLayout)mMyView.findViewById(R.id.SummaryDetailLayout);
mDateTxtView = (TextView) mMyView.findViewById(R.id.txtDate);
Account_Id = AccountDetails.getInstance(mContext).getClientCodes().get(0);
sendRequest(Account_Id);
return mMyView;
}
@Override
public void onPageSelected(int arg0) {
System.out.println("inside onPageScrollStateChanged()");
System.out.println("mMyView is null ? = "+(mMyView==null));
mDateTxtView = (TextView) mMyView.findViewById(R.id.txtMarketSummaryDate);
Account_Id = AccountDetails.getInstance(mContext).getClientCodes().get(0);
mDateTxtView.setText("");
sendRequest(Account_Id);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是当刷出5-6个片段并向后滑动到第一个片段时,我得到NullPointerException.
当我尝试调试时,我发现了
mMyView为空?=真
为什么这样? …
android android-fragments fragmentpageradapter android-fragmentactivity
在FragmentParentNewsDetail.java类中,我有一个ViewPager,然后我使用FragmentPagerAdapter将每个页面设置为相同的Fragment,如下所示:
@Override
public Fragment getItem(int position)
{
String newsId = this.myNewsIds.get(position);
Bundle bundle = new Bundle();
bundle.putInt(FragmentNewsDetail.NEWS_ID, Integer.parseInt(newsId));
FragmentNewsDetail fragmentNewsDetail = new FragmentNewsDetail();
fragmentNewsDetail.setArguments(bundle);
return fragmentNewsDetail;
}
Run Code Online (Sandbox Code Playgroud)
在FragmentNewsDetail.java中,我有一个公共方法:
public String getNewsTitle()
{
Log.d(TAG, "getNewsTitle:" + newsTitle);
return newsTitle;
}
Run Code Online (Sandbox Code Playgroud)
然后我想在FragmentNewsDetail.java中调用getNewsTitle()方法,如下所示:
newsTitle = ((FragmentNewsDetail)myAdapter.getItem(vpViewPager.getCurrentItem())).getNewsTitle();
Run Code Online (Sandbox Code Playgroud)
但getNewsTitle()总是返回"",我对此感到困惑.
通过以下方法修复:
public Fragment getCurrentFragment(ViewPager pager,
FragmentPagerAdapter adapter)
{
try
{
Method m = adapter
.getClass()
.getSuperclass()
.getDeclaredMethod("makeFragmentName", int.class,
long.class);
Field f = adapter.getClass().getSuperclass()
.getDeclaredField("mFragmentManager");
f.setAccessible(true);
FragmentManager fm = (FragmentManager) f.get(adapter);
m.setAccessible(true);
String tag = null;
tag …
Run Code Online (Sandbox Code Playgroud) 我知道有关此异常的问题很多,但是,在使用时,我只有一次分配就遇到了此异常FragmentStatePagerAdapter
。
在设置适配器和寻呼机时,我在下面指出了发生崩溃的行。
设置我的Fragment
s:
android.support.v4.app.FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.add(0, new StarTabFragment(), "starTab");
t.add(0, new HierarchiesTabFragment(), "hierarchyTab");
t.add(0, new GroupsTabFragment(), "groupTab");
t.add(0, new VehiclesTabFragment(), "hierarchyTab");
t.commit();
Run Code Online (Sandbox Code Playgroud)
设置我的适配器和寻呼机:
viewPager = (ViewPager) mDrawerLayoutRight.findViewById(R.id.pager);
PagerTabStrip tabs = (PagerTabStrip) mDrawerLayoutRight.findViewById(R.id.pager_tab_strip);
tabs.setTabIndicatorColor(Color.RED);
CustomPagerAdapter customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
viewPager.setOffscreenPageLimit(customPagerAdapter.getCount() - 2);
viewPager.setAdapter(customPagerAdapter); //crashing here
viewPager.setOnPageChangeListener(new LoopingPageChangeListener(viewPager));
viewPager.setCurrentItem(1);
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:876)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.IllegalStateException: Fragment already added: StarTabFragment{d12eb55 …
Run Code Online (Sandbox Code Playgroud) 我有一个FragmentActivity和FragmentPagerAdapter,它包含许多Fragment对象,我可以通过水平滑动来滑动它们.
我想知道我是否可以从Fragment对象中访问FragmentActivity中的元素("elementToBeChanged")?我想将Fragment类中的String传递给FragmentActivity对象中的TextView元素.
public class GalleryPagerActivity extends FragmentActivity implements OnClickListener {
private TextView elementToBeChanged;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.gallery_pager);
elementToBeChanged = (TextView) findViewById(R.id.tvTop);
elementToBeChanged.setOnClickListener(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么会这样做?每当Fragment对象进入视线(使用滑动)时,都必须更新TextView元素.
它应该看起来像这样:
public class GalleryFragment extends Fragment {
private FragmentActivity fa;
private LinearLayout ll;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
fa = super.getActivity();
ll = (LinearLayout) inflater.inflate(R.layout.gallery_fragment, container, false);
...
// ////////
// UPDATE THE "TextView elementToBeChanged" object in the parent FragmentActivity class HERE WHENEVER THIS FRAGMENTS BECOMES …
Run Code Online (Sandbox Code Playgroud) 我有几个用ViewPager
. 我在 MainActivity 的方法中addOnPageChangeListener
添加了一个,它给出了所选片段的位置。ViewPager
onCreate
尽管我通过声明 a 来防止片段自行销毁setOffscreenPageLimit
,但我仍然没有弄清楚如何从 MainActivity 访问片段,因为简单地使用findViewById
会返回空对象异常。
我想做的事:
我想访问片段的元素,例如布局和滚动视图,OnPageListener
在ViewPager
:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int i) {
if(i == 0) {
// Do something with the first fragment.
} else if(i == 1) {
// Do something with the second fragment.
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用ViewPager
:FragmentPagerAdapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public …
Run Code Online (Sandbox Code Playgroud)