带有适配器“”的 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的主要内容,如果未能解决你的问题,请参考以下文章