相关疑难解决方法(0)

IllegalStateException:无法更改片段的标签是android:switcher now android:switcher

我的活动使用TabLayout+ ViewPager.

此处的选项卡和页面数量是动态的,具体取决于从服务器获取的数据.

崩溃是通过Crashlytics报道的,我无法复制它.

我的活动代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        boolean isAppRestarting = PrefUtils.getBoolean("app_restarting", false);
        if (isAppRestarting) {
            super.onCreate(null);
            this.savedInstanceState = null;
        } else {
            super.onCreate(savedInstanceState);
            this.savedInstanceState = savedInstanceState;
        }

        initSlidingTabs();

        fetchSomeData(); // see onDataFetched() below
    }

private void initSlidingTabs() {
        List<FragmentWithTitle> sdsTabs = new ArrayList<>();
            Logger.i("There is saved instance state");
            ArrayList<String> titles = savedInstanceState.getStringArrayList(TAB_TITLES);
            if (titles != null) {
                for (int i = 0; i < titles.size(); i++) {
                    if (getFragment(i) != null) {
                        sdsTabs.add(new …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager fragmentpageradapter android-tablayout

16
推荐指数
1
解决办法
7149
查看次数

ViewPager和FragmentPagerAdapter中的片段的Android生命周期管理

我一直在努力找出哪些片段内的正确管理FragmentActivityViewPager的.在我详细介绍之前,我面临的问题的快速摘要如下:

我有FragmentActivity一个ViewPager.在ViewPager使用自定义的,但非常简单FragmentPagerAdapter.每个Fragment所述内ViewPager的包括ExpandableListView.我还有一个名为"刷新"的操作栏按钮.现在,我们假设ViewPager只有一个Fragment.创建活动,并填充Fragment's' ExpandableListView(迄今为止很好).单击"刷新"按钮时,FragmentActivity迭代在其列表中的处理方法Fragments将分配给FragmentPagerAdapter,并refresh()在每个Fragment上调用以填充其ListView.但是,当设备的方向发生变化时(例如,从纵向到横向),将重新创建活动,片段也是如此.现在单击"刷新"按钮将迭代未初始化Fragments.

我知道我很模糊,特别是没有示例代码,但请耐心等待.我从应用程序/活动的开头跟踪了问题和方法调用:

  1. FragmentActivity.onCreate()
  2. FragmentActivity.setContentView()
  3. FragmentActivity.createPagerFragments() < - 这将创建一个Fragments的ArrayList,并将它们分配给一个新的FragmentPagerAdapter,而FragmentPagerAdapter又分配给ViewPager.
  4. Fragment.onAttach()
  5. Fragment.onCreate() < - 这里没什么特别的,只是调用super方法.
  6. Fragment.onCreateView() < - 这里没什么特别的,只是给布局充气
  7. Fragment.onActivityCreated() < - 这里也没什么.
  8. <<所有好,方向在这里改变>>
  9. FragmentActivity.onCreate()
  10. Fragment.onAttach()
  11. Fragment.onCreate()
  12. FragmentActivity.setContentView()
  13. FragmentActivity.createPagerFragments()
  14. Fragment.onCreateView()
  15. Fragment.onActivityCreated()
  16. <<点击刷新按钮>>
  17. FragmentActivity.refresh() < - 迭代来自#13的新创建的碎片(不是Android的这些!).
  18. <<崩溃:Fragment中mExpandableListView的NullPointerException.>>

所以问题,正如我所看到的,如下所示:当Android 在屏幕方向改变后重新创建FragmentActivity它时Views(上面调用#9-15),它会创建新Fragment对象,其状态恢复到原始对象的状态.然而,这些似乎完全由 …

android android-fragments android-viewpager android-fragmentactivity

14
推荐指数
1
解决办法
1万
查看次数

致命异常:java.lang.IllegalStateException:失败保存状态:已从FragmentManager中删除活动片段

我最近将我的应用程序更改为目标API级别28,并且还开始使用androidx而不是支持库.在更改之后,我注意到具有以下回溯的崩溃

Fatal Exception: java.lang.IllegalStateException: Failure saving state: active MyFragment{22caf6fc (04a7bbf5-8806-4a45-a25d-616ed244bf18) id=0x7f1000ff} was removed from the FragmentManager
       at androidx.fragment.app.FragmentManagerImpl.saveAllState(FragmentManagerImpl.java:2301)
       at androidx.fragment.app.FragmentController.saveAllState(FragmentController.java:150)
       at androidx.fragment.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:496)
       at androidx.appcompat.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:510)
       at com.company.utils.MyAppCompatActivity.onSaveInstanceState(MyAppCompatActivity.java:161)
       at android.app.Activity.performSaveInstanceState(Activity.java:1311)
       at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1288)
       at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4166)
       at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3577)
       at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3633)
       at android.app.ActivityThread.access$1300(ActivityThread.java:164)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1491)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:160)
       at android.app.ActivityThread.main(ActivityThread.java:5541)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
Run Code Online (Sandbox Code Playgroud)

我的所有活动都是从一个基础活动MyAppCompatActivity扩展而来的AppCompatActivity.在onSaveInstanceState方法中MyAppCompatActivity,我有一些日志行.我在ViewPager下实现了此活动中的三个片段,FragmentStatePageAdapter并且活动本身不是重写onSaveInstanceState方法.

我经历了一些接近这个的SO帖子,例如这个这个,但是当我们使用FragmentManager自己的方法管理片段而不是使用ViewPagerAdapter来处理它时,它看起来好像正在发生.我不是那样做的,我正在做的最接近通常流程的是覆盖FragmentStatePageAdapter方法,instantiateItemdestroyItem帮助我有一个方法来获得代码中的片段引用,如 …

android android-fragments androidx

12
推荐指数
2
解决办法
3085
查看次数

无法刷新/更新ViewPager中另一个片段的片段中的listview

我很难搞清楚下一件事.

我拥有:我有一个viewpager和几页.在这个问题中,只有两个是重要的,我们称之为Fragment1和Fragment2,它们彼此相邻.Fragment1包含一个列表视图,其中填充了来自Internet(外部数据库)的数据.Fragment2包含一个简单的按钮.

我的目标:如果我点击Fragment2中的按钮,我会向外部数据库添加一个新项目.我想用这个新项更新/刷新Fragment1中的列表视图.

notifyDataChanged()在我的情况不工作,但到目前为止,我确信它重新实例每一个页面..我要介绍我的问题,我可以最清楚的方式,所以让我们看看我的代码,这是我的ViewPager适配器:

class MyPagerAdapter extends FragmentStatePagerAdapter {
        public List<String> fragmentsA; 

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            fragmentsA = fragments;
        }

        @Override
        public Fragment getItem(int position) {
           return Fragment.instantiate(context, fragmentsA.get(position));

        }

        @Override
        public CharSequence getPageTitle(int position) {
           return mEntries.get(position % CONTENT.length).toUpperCase();
        }

        @Override
        public int getCount() {
          return mEntries.size();
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Fragment1 onCreateView()(简称):

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

    getData();
    View …
Run Code Online (Sandbox Code Playgroud)

android fragment android-listview android-viewpager fragmentpageradapter

10
推荐指数
1
解决办法
9789
查看次数

ViewPager片段不在onCreate中启动

无论我是否尝试使用onCreate(),onCreateView()或onResume(),我似乎都在更新我在ViewPager中使用的片段时出现问题.以下是我在MainFragment中设置ViewPager的方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View rootView = inflater.inflate(R.layout.fragment_main_screen, container, false);

        mPager = (ViewPager)rootView.findViewById(R.id.pager);
        mPager.setOffscreenPageLimit(2); // So all 3 pages are loaded at once.
        mAdapter = new JournalPagerAdapter(getActivity().getSupportFragmentManager(), this);
        mPager.setAdapter(mAdapter);

        // Add bar graph to view
        mGraphLayout = (LinearLayout) rootView.findViewById(R.id.journalGraph);
        updateGraph();
        mGraphLayout.addView(mGraphView);

        mPainFrag = (PainFragment)mAdapter.getRegisteredFragment(0);
        // Null pointer here, but if I put the action in a button listener, it works.
        mPainFrag.setScale(mEntry.getPain());
...
Run Code Online (Sandbox Code Playgroud)

我通过FragmentPagerAdapter中的一些重写方法访问片段:

public class JournalPagerAdapter extends FragmentPagerAdapter {

    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager

7
推荐指数
1
解决办法
1350
查看次数

在ViewPager中同步所有ListView

在我的应用程序中,我有一个ViewPager,每个ViewPager都有一个自定义ListView链接到表格中的行.问题是,当我在第一页中滚动ListView然后滚动ViewPager时,第一页的ListView和第二页的ListView未对齐.listView必须对齐,因为在第一个中我有一个带有描述的TextView,然后有4个带有数据的颜色,而在下一个没有描述的ListViews 6颜色中,所以如果它们未对齐,那么它非常复杂.那么如何一次滚动所有listViews?

编辑:

非常感谢Rahul Parsani ...我终于设法如何做到这一点......如果你有listView在单独的片段中,并且片段的编号是未定义的,这就是答案:

final ArrayList<ListView> lvs = new ArrayList<ListView>();
        for (int j = 0; j < adapter.getCount(); j++) {
            YourFragment fragJ = (YourFragment) adapter.getItem(j);
            final ListView listViewJ = fragJ.lv;
            lvs.add(listViewJ);
        }

        for (int j = 0; j < lvs.size(); j++) {
            final int x = j;
            lvs.get(j).setOnTouchListener(new OnTouchListener() {

                boolean dispatched = false;
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (!dispatched) {
                        dispatched = true;
                        if (x != 0) {
                            lvs.get(x - 1).dispatchTouchEvent(event);
                        };
                        if …
Run Code Online (Sandbox Code Playgroud)

android listview android-listview android-fragments android-viewpager

6
推荐指数
1
解决办法
8095
查看次数

当列表视图位于片段中时,如何使用活动中的Searchview过滤列表视图

我想实现以下屏幕:

在此输入图像描述

正如您在此处所看到的,SearchView位于包含三个tab的活动中.每个选项卡都使用片段实现,片段又包含listview.我在包含搜索视图的活动中有View Page.使用FragmentStatePagerAdapter.I通过片段填充Pager想要使用搜索视图过滤活动选项卡的列表视图.

包含SearchView的活动代码:

   @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.menu_friend_list_activity, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search:
            Toast.makeText(getApplicationContext(), "Search button clicked", Toast.LENGTH_SHORT).show();

            // Associate searchable configuration with the SearchView
            SearchManager searchManager = (SearchManager) FriendsListActivity.this.getSystemService(Context.SEARCH_SERVICE);
            if (item != null) {
                searchView = (SearchView) item.getActionView();
            }
            if (searchView != null) {
                searchView.setSearchableInfo(searchManager.getSearchableInfo(FriendsListActivity.this.getComponentName()));
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

}
Run Code Online (Sandbox Code Playgroud)

menu_friend_list_activity.java

  <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search" …
Run Code Online (Sandbox Code Playgroud)

android searchview

6
推荐指数
0
解决办法
4222
查看次数

片段在ViewPager上可见时启动动画

我正在使用ViewPager和FragmentStatePagerAdapter,我希望在片段可见且仅在可见时才在片段中启动动画.问题是当片段是用户当前看到的片段之后的片段时动画开始.我将动画代码从"onActivityCreated"片段函数移动到"onStart"片段函数,甚至移动到"onResume"片段函数,但同样的事情发生了.

基本上我需要等待片段成为用户看到的用于启动某些代码的页面.我怎样才能做到这一点?

提前致谢.

android onstart fragment android-viewpager

5
推荐指数
1
解决办法
5164
查看次数

当返回到已停止的活动时,碎片会因旧数据而膨胀

活动 A 有片段。当它启动对活动 B 的意图时B.finish(),然后当 时,AonCreate()再次执行。

但这一次,即使A.onCreate()有 newPacksPagerAdapter和 new ViewPager,片段也显示为旧数据。

我可以看到它onCreateView()为每个片段执行,但由于static newInstance()没有调用它,它仍然具有旧参数。getItem(position)调用FragmentPagerAdapter 时会创建参数。

这是它的实施方式 -

public class PackActivity extends Activity {
    ...
    PacksPagerAdapter mPacksPagerAdapter;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPacksPagerAdapter = new MyPagerAdapter(getFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mPacksPagerAdapter);
        mViewPager.setOffscreenPageLimit(PACK_PAGES - 1);

        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setTitle(...);
                    } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager android-activity android-pageradapter

5
推荐指数
1
解决办法
2900
查看次数

转到ViewPager中的下一页

ViewPager我的MainActivity中有一个.其中的每一页都是片段.因此,每次向右或向左滑动时,都会创建一个新的片段实例,并相应地更新片段视图.

我也有两个按钮:LEFTRIGHT导航.这些按钮位于片段内,而不在活动中.用户可以滑动或者按相关按钮在页面之间导航.

问题在于:由于我正在通过MainActivity更改视图,如何onClick在Activity中检测这些按钮的事件以更新片段?

这是PagerAdapter类(从所有地方删除所有不相关的代码):

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {

        // logic part for the views.

        return PlaceholderFragment.newInstance(sectionNumber, questionStatus, questionOrder, showNext, showPrevious);
    }
Run Code Online (Sandbox Code Playgroud)

这是PlaceHolderFragment班级:

public class PlaceholderFragment extends Fragment{

    //some global variables

    public static PlaceholderFragment newInstance(int sectionNumber, int questionStatus, String questionOrder, boolean showNext, boolean showPrevious) {
        PlaceholderFragment fragment = new PlaceholderFragment();

        //setting up the arguments …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager

5
推荐指数
3
解决办法
1万
查看次数