我在Android中玩片段.
我知道我可以使用以下代码更改片段:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
Run Code Online (Sandbox Code Playgroud)
我的问题是,在Java文件中,如何获取当前显示的Fragment实例?
我无法更新ViewPager中的内容.
一个问题:FragmentPagerAdapter类中的方法instantiateItem()和getItem()的关系和正确用法是什么?
我只使用getItem()实例化并返回我的片段:
@Override
public Fragment getItem(int position) {
return new MyFragment(context, paramters);
}
Run Code Online (Sandbox Code Playgroud)
这很好用(但据说我不能改变内容).
所以我发现了这个:ViewPager PagerAdapter没有更新View
特别是在其中讨论了方法instantiateItem():
"我的方法是对instantiateItem()方法中的任何实例化视图使用setTag()方法"
所以现在我想实现instantiateItem()才能做到这一点.但我不知道我必须返回那里(return是Object)和getItem(int position)的关系是什么?
目前我正在使用getItem来实例化Fragment,这是错的吗?但是,我是否必须将片段放在实例变量中,或者根本不实现getItem()......?我只是不明白.
我试过阅读参考资料:
public abstract Fragment getItem(int position)
返回与指定位置关联的片段.
public Object instantiateItem(ViewGroup容器,int位置)
创建给定位置的页面.适配器负责将视图添加到此处给出的容器,但它必须确保在从finishUpdate(ViewGroup)返回时完成此操作.参数
容器包含将在其中显示页面的View.position要实例化的页面位置.
返回
返回表示新页面的Object.这不需要是View,但可以是页面的其他容器.
......但我仍然不明白它们是如何相关的以及我必须做些什么.
这是我的代码.我正在使用支持包v4.
ViewPagerTest
public class ViewPagerTest extends FragmentActivity {
private ViewPager pager;
private MyFragmentAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pager1);
pager = (ViewPager)findViewById(R.id.slider);
String[] data = {"page1", "page2", "page3", "page4", "page5", "page6"};
adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, …Run Code Online (Sandbox Code Playgroud) 下面是我的代码,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) 在我的main.xml我
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
我正在设置像这样的片段对象
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
它FragmentType2,FragmentType3,...在不同的时间设置不同类型的Fragment对象().现在在某个时间点我需要确定当前存在哪个对象.
在短,我需要做这样的事情:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
Run Code Online (Sandbox Code Playgroud)
和
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Run Code Online (Sandbox Code Playgroud)
但是两个对象(titleFragmentById和titleFragmentByTag)都是null
我错过了什么吗?
我正在使用Compatibility Package, r3和开发API level …
我正在使用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
我有问题使我的片段通过Activity使用FragmentPagerAdapter,作为帮助类来实现对标签的管理以及连接ViewPager关联的所有细节TabHost.我的实现FragmentPagerAdapter与Android示例项目Support4Demos提供的一样.
主要问题是FragmentManager当我没有Id或Tag时,如何从特定片段中获取特定片段?FragmentPagerAdapter正在创建片段并自动生成Id和标签.
onResume()当我们在片段之间切换多次时,不会调用方法.那么,有没有更好的方法来处理恢复操作?
我正在尝试实现保存和恢复状态,但是当用Fragmenta 替换main PreferenceFragment然后按下后退按钮时遇到问题.我的主要Fragment包括ViewPager一个FragmentPagerAdapter用3 Fragments来刷卡.点击后退按钮后,没有调用Fragment.onCreateView()我的3 Fragment秒的回调.我已经尝试了所有我在这里遇到的解决方案,但我无法解决这个问题.
另一个可能需要注意的重要事项是,我的3s ViewPager Fragment的数据存储在单独的类中,这些类是实例化的,可以通过Activity.3 Fragments包含RecyclerView用于列出大量数据的s.这样做是为了清洁,但也是为了使这些数据持续存在Activity.这可能不是问题,因为它在启动应用程序时工作正常,但也因为主要问题是我Fragments没有重新创建.
意外行为:
在应用程序创建时,一切正常,但是当我用另一个替换我的main Fragment(包含ViewPagera FragmentPagerAdapter),然后按下后退按钮时,不会重新创建Fragments中的s ViewPager.在onCreateView()我的主要的Fragment 被调用.
问题:
我错过了什么?是否还应该创建一些其他回调?我应该在哪里以及如何重建Fragments?
我试过了什么:
FragmentAdapter使用,但我真的应该使用这里getSupportFragmentManager()的解决方案.编辑:使用错误FragmentManager实际上是我的麻烦的来源.请参阅下面的答案.
@Override public int getItemPosition(Object object) {return POSITION_NONE;}到FragmentPagerAdapter,如此处所示. …android android-lifecycle android-fragments android-viewpager
我有一个带有两个片段的简单viewPager.每个片段都包含一个TextView.我希望能够更新活动中显示的当前textView的文本.
活动:
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ArrayList<Fragment> fragments = new ArrayList<Fragment>();
fragments.add(Fragment.instantiate(this, Live.class.getName()));
fragments.add(Fragment.instantiate(this, Hit.class.getName()));
this.pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),fragments);
ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
pager.setAdapter(pagerAdapter);
}
}
Run Code Online (Sandbox Code Playgroud)
适配器:
public class MyPagerAdapter extends FragmentPagerAdapter {
private final ArrayList<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, ArrayList<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 …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)