簡體   English   中英

我在我的項目中使用帶有TabLayout的Fragments和ViewPager,它未在設備上運行

[英]i am using Fragments and a ViewPager with a TabLayout in my project , it is not running on devices

我已經與許多其他應用進行了比較。 但我找不到我錯了。

這是我所做的

[我更改了gradle版本28.0.0-beta01> 27.1.1,檢查了所有xml文件,清理並重建了項目,並且看到了許多有關帶有TabLayout的Viewpager的視頻。]

activity_main(TabLayout + ViewPager),ganglist(ListView,id / list),list_item(1 ImageView,2 Textview)

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Find the view pager that will allow the user to swipe between fragments
    ViewPager viewPager = findViewById(R.id.viewpager);
    // Create an adapter that knows which fragment should be shown on each page
    CategoryAdapter adapter = new CategoryAdapter(this,getSupportFragmentManager());
    // Set the adapter onto the view pager
    viewPager.setAdapter(adapter);

    TabLayout tabLayout= findViewById(R.id.tabs);
    // Connect the tab layout with the view pager. This will
    //   1. Update the tab layout when the view pager is swiped
    //   2. Update the view pager when a tab is selected
    //   3. Set the tab layout's tab names with the view pager's adapter's titles
    //      by calling onPageTitle()
    tabLayout.setupWithViewPager(viewPager);
   }
}

public class CategoryAdapter extends FragmentPagerAdapter {
private Context mContext;

public CategoryAdapter(Context context, FragmentManager fm) {
    super(fm);
    mContext = context;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new YeoidoFragment();
        case 1:
            return new YeoidoFragment();
        case 2:
            return new YeoidoFragment();
        default:
            return null;
    }
}


public int getCount() {
    return 1;
}


@Nullable
@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return mContext.getString(R.string.yeouido_hangang_park);
        case 1:
            return mContext.getString(R.string.banpo_hangang_park);
        case 2:
            return mContext.getString(R.string.banpo_hangang_park);
        default:
            return null;
      }
   }
}

我正在使用相同的片段進行測試

public class Gang {
private int ImageResourceId;
private String Feature;
private String Explanation;

public Gang(int ImageResourceId, String Feature, String Explanation){
    this.ImageResourceId = ImageResourceId;
    this.Feature = Feature;
    this.Explanation = Explanation;
}

public int getImageResourceId(){return ImageResourceId;}
public void setImageResourceId(int ImageResourceId){
    this.ImageResourceId= ImageResourceId;
}
public String  getFeature(){return Feature;}
public void setFeature(String Feature){
    this.Feature = Feature;
}
public String getExplanation(){return Explanation;}
public void setExplanation(String Explanation){
    this.Explanation =  Explanation;
   }
}

public class GangAdapter extends ArrayAdapter<Gang> {
public GangAdapter(Context context, ArrayList<Gang>gangs){
    super(context, 0, gangs);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View listItemView = convertView;
    if(listItemView==null){
        listItemView= LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
    }
    Gang currentFeature = getItem(position);

    ImageView spotImageView = listItemView.findViewById(R.id.Image);
    spotImageView.setImageResource(currentFeature.getImageResourceId());

    TextView featureTextView = listItemView.findViewById(R.id.where);
    featureTextView.setText(currentFeature.getFeature());

    TextView detailTextView = listItemView.findViewById(R.id.about);
    detailTextView.setText(currentFeature.getExplanation());

    return listItemView;
   }
}

public class YeoidoFragment extends Fragment {


public YeoidoFragment() {
    // Required empty public constructor
}


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

  View rootView= inflater.inflate(R.layout.ganglist, container, false);

  final ArrayList<Gang> gangs = new ArrayList<>();
  gangs.add(new Gang(R.drawable.yeouido1, getString(R.string.yeouido),getString(R.string.app_name)));

   GangAdapter adapter = new GangAdapter(getActivity(), gangs);

    ListView listView= rootView.findViewById(R.id.list);

    listView.setAdapter(adapter);
    return rootView;
   }
}

從logcat

08-06 21:32:41.805 8882-8882 / com.example.android.hangangabout E / Zygote:isWhitelistProcess-進程被列入白名單08-06 21:32:41.806 8882-8882 / com.example.android.hangangabout W / SELinux :SELinux selinux_android_compute_policy_index:策略索引[2],Con:u:r:zygote:s0 RAM:SEPF_SM-G950N_8.0.0_0005,[-1 -1 -1 -1 0 1] 08-06 21:32:41.807 8882- 8882 / com.example.android.hangangabout I / SELinux:SELinux:seapp_context_lookup:seinfo =不可信,level = s0:c512,c768,pkgname = com.example.android.hangangabout 08-06 21:32:41.810 8882-8882 / com.example.android.hangangabout I / zygote64:后期啟用-Xcheck:jni 08-06 21:32:41.878 8882-8882 / com.example.android.hangangabout D / ActivityThread:添加了TimaKeyStore提供程序08-06 21:32 :42.026 8882-8924 / com.example.android.hangangabout I / vndksupport:此過程未配置sphal命名空間。 而是從當前名稱空間加載/vendor/lib64/egl/libGLES_mali.so。 08-06 21:32:42.036 8882-8882 / com.example.android.hangangabout I / InstantRun:啟動即時運行服務器:是主進程08-06 21:32:42.045 8882-8924 / com.example.android.hangangabout D / libEGL:已加載/vendor/lib64/egl/libGLES_mali.so 08-06 21:32:42.990 8882-9058 / com.example.android.hangangabout D / OpenGLRenderer:HWUI GL Pipeline 08-06 21:32:43.001 8882 -8882 / com.example.android.hangangabout D / ViewRootImpl @ c5bf86a [MainActivity]:setView = DecorView @ 4d5415b [MainActivity] TM = true MM = false 08-06 21:32:43.011 8882-8882 / com.example.android .hangangabout D / ViewRootImpl @ c5bf86a [MainActivity]:dispatchAttachedToWindow 08-06 21:32:43.067 8882-8882 / com.example.android.hangangabout V /曲面:sf_framedrop debug:0x4f4c,游戲:false,日志記錄:0 08-06 21:32:43.068 8882-8882 / com.example.android.hangangabout D / ViewRootImpl @ c5bf86a [MainActivity]:中繼返回:old = [0,0] [0,0] new = [0,0] [1440, 2960] result = 0x7 surface = {valid = true 539904405504}已更改= true 08-06 21:32:43.091 8882-9058 / com.example.and roid.hangangabout I / OpenGLRenderer:初始化的EGL,版本1.4 08-06 21:32:43.091 8882-9058 / com.example.android.hangangabout D / OpenGLRenderer:交換行為2 08-06 21:32:43.100 8882-9058 / com.example.android.hangangabout D / libGLESv1:STS_GLApi:DTS,ODTC不允許用於Package:com.example.android.hangangabout 08-06 21:32:43.101 8882-9058 / com.example.android.hangangabout D / mali_winsys:EGLint new_window_surface(egl_winsys_display *,void *,EGLSurface,EGLConfig,egl_winsys_surface **,egl_color_buffer_format *,EGLBoolean)返回0x3000,[1440x2960] -format:1 08-06 21:32:43.101 8882-9058 / com.example。 android.hangangabout D / OpenGLRenderer:eglCreateWindowSurface = 0x7dbb41daf0 08-06 21:32:43.458 8882-8882 / com.example.android.hangangabout D / AbsListView:在onLayout中更改為08-06 21:32:43.497 8882-8882 / com。 example.android.hangangabout D / AndroidRuntime:關閉VM 08-06 21:32:43.516 8882-8882 / com.example.android.hangangabout E / AndroidRuntime:FATAL EXCEPTION:主進程:c om.example.android.hangangabout,PID:8882 java.lang.RuntimeException:畫布:嘗試繪制太大(132710400bytes)位圖。 在android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229)在android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97)在android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529)在android。 view.View.getDrawableRenderNode(View.java:20627)位於android.view.View.drawBackground(View.java:20563)位於android.view.View.draw(View.java:20343)位於android.view.View.updateDisplayListIfDirty (View.java:19297),位於android.view.View.draw(View.java:20075),位於android.view.ViewGroup.drawChild(ViewGroup.java:4421),位於android.view.ViewGroup.dispatchDraw(ViewGroup.java: 4207),位於android.view.View.updateDisplayListIfDirty(View.java:19288),位於android.view.View.draw(View.java:20075),位於android.view.ViewGroup.drawChild(ViewGroup.java:4421)。 view.ViewGroup.dispatchDraw(ViewGroup.java:4207)在android.view.View.updateDisplayListIfDirty(View.java:19288)在android.view.View.draw(View.java:20075)在android.view.ViewGroup.drawChild (ViewGroup.java:4421)在android.vi ew.ViewGroup.dispatchDraw(ViewGroup.java:4207)在android.view.View.updateDisplayListIfDirty(View.java:19288)在android.view.View.draw(View.java:20075)在android.view.ViewGroup.drawChild (ViewGroup.java:4421)在android.view.ViewGroup.dispatchDraw(ViewGroup.java:4207)在android.view.View.updateDisplayListIfDirty(View.java:19288)在android.view.View.draw(View.java: com上的android.view.ViewGroup.dispatchDraw(ViewGroup.java:4207)的android.view.ViewGroup.drawChild(ViewGroup.java:4421)的android.view.ViewGroup.drawChild(ViewGroup.java:4421)。 android.view.View.updateDisplayListIfDirty(View.java:19297)位於android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)位於android.internal.policy.DecorView.draw(DecorView.java:979) android.view.ThreadedRenderer.draw(ThreadedRenderer.java:800)的.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)android.view.ViewRootImpl.draw(ViewRootImpl.java:3451)android.view.ViewRootImpl.performDraw(爭奪 wRootImpl.java:3238)位於android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2773)位於android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1742)位於android.view.ViewRootImpl $ TraversalRunnable.run :7763),位於android.view.Choreographer $ CallbackRecord.run(Choreographer.java:911),位於android.view.Choreographer.doCallbacks(Choreographer.java:723),位於android.view.Choreographer.doFrame(Choreographer.java:658)在android.os.Handler.dispatchMessage(Handler.java:98)在android.os.Handler.handleCallback(Handler.java:789)在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:897)處。 android.app.ActivityThread.main(ActivityThread.java:6938)上的os.Looper.loop(Looper.java:164)com.android.internal.os上的java.lang.reflect.Method.invoke(Native Method)的os.Looper.loop(Looper.java:164) Zygote $ MethodAndArgsCaller.run(Zygote.java:327)位於com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

我認為int getCount()應該返回3

您應該在以下位置定義或創建陣列列表適配器

public void onViewCreated(View view,@Nullable Bundle saveInstanceState){

}

在logcat正在報告時,您正在嘗試繪制將大位圖導入畫布的方法:

 FATAL EXCEPTION: main Process: com.example.android.hangangabout, PID: 8882 java.lang.RuntimeException: Canvas: trying to draw too large(132710400bytes) bitmap.

超過132兆字節! 在繪制之前,應先縮放圖像。 通常,不需要這么大的位圖,因為您的設備沒有足夠的像素來顯示它。

此外,擁有如此大的物體很危險,因為您應用的RAM限制受設備限制(該限制取決於設備)。 通常,您的應用只能使用32mb的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM