带有适配器“”的 ViewPager 需要 AsyncTask 中的视图 ID
Posted
技术标签:
【中文标题】带有适配器“”的 ViewPager 需要 AsyncTask 中的视图 ID【英文标题】:ViewPager with adapter " " requires a view id In AsyncTask 【发布时间】:2020-02-16 13:41:50 【问题描述】:我有一个 AsyncTask,我在其中创建了一个 ViewPager,当我为它分配一个适配器时,会出现此错误
java.lang.IllegalStateException:带有适配器 com.example.kos.PagerAdapterZvon@646addd 的 ViewPager 需要视图 ID 在 androidx.fragment.app.FragmentPagerAdapter.startUpdate(FragmentPagerAdapter.java:83) 在 androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1124) 在 androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092) 在 androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:726) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733) 在 androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:805) 在 android.view.View.measure(View.java:23466) 在 androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:726) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:726) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 com.android.internal.policy.DecorView.onMeasure(DecorView.java:847) 在 android.view.View.measure(View.java:23466) 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2954) 在 android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1753) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2041) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1636) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7946) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092) 在 android.view.Choreographer.doCallbacks(Choreographer.java:893) 在 android.view.Choreographer.doFrame(Choreographer.java:812) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078) 在 android.os.Handler.handleCallback(Handler.java:907) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:216) 在 android.app.ActivityThread.main(ActivityThread.java:7625) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
异步任务
class StartAsyncTask extends AsyncTask<Void,String[],Void>
@Override
protected void onPreExecute()
super.onPreExecute();
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
linearLayout.removeAllViews();
ProgressBar progressBar = new ProgressBar(context);
linearLayout.addView(progressBar, layoutParams);
@Override
protected void onPostExecute(Void aVoid)
super.onPostExecute(aVoid);
LinearLayout.LayoutParams layoutParamsKek = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParamsKek.gravity = Gravity.CENTER;
linearLayout.removeAllViews();
ViewPager viewPager = new ViewPager(context);
viewPager.setAdapter(pagerAdapter);
linearLayout.addView(viewPager,layoutParamsKek);
// Date start = new Date();
// switch (start.toString().substring(0,3))
// case "Mon":
// viewPager.setCurrentItem(0);
// url = "Monday.txt";
// break;
// case "Tue":
// viewPager.setCurrentItem(1);
// url = "Tuesday.txt";
// break;
// case "Wed":
// viewPager.setCurrentItem(2);
// url = "Wednesday.txt";
// break;
// case "Thu":
// viewPager.setCurrentItem(3);
// url = "Thursday.txt";
// break;
// case "Fri":
// viewPager.setCurrentItem(4);
// url = "Friday.txt";
// break;
// case "Sat":
// viewPager.setCurrentItem(5);
// url = "Saturday.txt";
// break;
// default:
// viewPager.setCurrentItem(0);
// url = "Monday.txt";
// break;
//
//// SharedPreferences.Editor editor = settings.edit();
//// editor.putString("Day", url);
//// editor.apply();
//// tabLayout.setupWithViewPager(viewPager);
//// tabLayout.setScrollX(tabLayout.getWidth());
//// tabLayout.getTabAt(5).select();
@Override
protected Void doInBackground(Void... voids)
pagerAdapter = new PagerAdapterZvon(getActivity().getSupportFragmentManager());
return null;
适配器
class PagerAdapterZvon extends FragmentPagerAdapter
private String[] name;
PagerAdapterZvon(@NonNull FragmentManager fm)
super(fm);
name = new String[]
"Понедельник",
"Вторник",
"Среда",
"Четверг",
"Пятница",
"Суббота"
;
@Override
public CharSequence getPageTitle(int position)
return name[position];
@Override
public int getCount()
return 6;
@NonNull
@Override
public Fragment getItem(int position)
switch (position)
case 0:
return new classMonday();
case 1:
return new classTuesday();
case 2:
return new classWednesday();
case 3:
return new classThursday();
case 4:
return new classFriday();
case 5:
return new classSaturday();
default:
return null;
所有动作都发生在一个片段中,如果删除 AsyncTask 并将所有动作转移到 onCreate ,一切正常
【问题讨论】:
【参考方案1】:只需调用 setId(R.id.your_id);
viewPager.setId(R.id.viewPagerId);
您可以通过按 OPTION + ENTER 创建一个 R.id id(在错误中,由于未解析的 id 而存在),然后单击 Create new id value。
【讨论】:
【参考方案2】:看来您完全是从代码而不是通过布局文件创建 Viewpager,这就是您收到该错误的原因(需要视图 ID)。创建viewpager时请按照此处的说明进行操作:
ViewPager with FragmentPagerAdapter
【讨论】:
是的,我在代码中创建了一个 ViewPager,就像我在另一个 AsyncTask 中所做的一样,但是使用了不同的适配器并且一切正常 您采用这种方法的任何具体原因?正确地说,ViewPager 是一个 UI 项,应该根据我共享的链接通过布局文件创建。从代码创建 UI 项目有很多处理,特别是如果您在 AsyncTask 中执行,因为它在另一个线程上运行。 在布局中添加一个 ID。在资源文件夹中定义一个 ID 并将该 ID 设置为您的布局,它可能会解决您的问题以上是关于带有适配器“”的 ViewPager 需要 AsyncTask 中的视图 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MainActivity 中的 Fragment 访问适配器?我正在使用带有 viewpager 的标签,所以没有交易等方法
FragmentStatePagerAdapter 内存泄漏(带有 viewpager 的嵌套片段)