ОШИБКА нехватки памяти при использовании фрагмента - PullRequest
0 голосов
/ 30 апреля 2018

Я использую Фрагмент в первый раз, когда я добавил 3 фрагмента в свою деятельность, проблема в том, что, когда я открываю мероприятие в первый раз (только в первый раз), я получаю эту ошибку:

04-28 17:51:02.539 5001-5001/com.example.dell.jsonapplication E/dalvikvm-heap: Out of memory on a 22125220-byte allocation.
        04-28 17:51:04.659 2427-2427/? E/Thermal-daemon: [flash_led] temp_new :30  temp_old :31

хотя мое приложение очень маленькое! и вот действие, которое содержит фрагменты:

package com.example.dell.jsonapplication;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class GuidActivity extends AppCompatActivity {

private SectionsPagerAdapter mSectionsPagerAdapter;

private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_guid);


    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_guid, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

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

        }
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}
}

и вот XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".GuidActivity">

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" >

</android.support.v4.view.ViewPager>

<Button
    android:layout_width="30dp"
    android:layout_height="40dp"
    android:layout_gravity="center"
    android:layout_margin="10dp"
    android:background="@drawable/back_frag"
    app:layout_anchor="@+id/container"
    app:layout_anchorGravity="left|center" />

<Button
    android:layout_width="30dp"
    android:layout_height="40dp"
    android:layout_gravity="center"
    android:layout_margin="10dp"
    android:background="@drawable/next_frag"
    app:layout_anchor="@+id/container"
    app:layout_anchorGravity="right|center" />

<ImageView
    android:layout_width="140dp"
    android:layout_height="30dp"
    android:layout_gravity="center"
    android:background="@drawable/frag_progress"
    app:layout_anchor="@+id/container"
    app:layout_anchorGravity="bottom|center" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|bottom"
    android:layout_margin="@dimen/fab_margin"
    app:srcCompat="@android:drawable/ic_menu_share" />

Пожалуйста, помогите: /

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Я пробовал много разных кодов и, наконец, я попробовал это:

android:largeHeap="true"

в Манифасетах, у меня работает.

0 голосов
/ 30 апреля 2018

Вместо:

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

        }
    }

Почему бы вам не:

List<Fragment> myFragments = new ArrayList();

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
    myFragments.add(new Guid1());
    myFragments.add(new Guid2());
    myFragments.add(new Guid3());
}

@Override
public Fragment getItem(int position) {
    if (position < myFragments.size()) {
        return myFragments.get(position);
    } else {
        return null;
    }
}

После изучения вашего кода, я предполагаю, что вы заполняете кучу экземплярами фрагментов. При таком подходе вы гарантируете, что создаете фрагменты только при создании адаптера при запуске приложения. Мы просто храним их в памяти во время работы приложения, вместо того, чтобы создавать новый каждый раз, когда вы хотите представить фрагмент.

Дайте мне знать, помогло ли это.


UPDATE:

Я обычно создаю свои фрагменты, а адаптер - с помощью addFragment ().

Вот так:

// here we set up our own adapter...
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

// ...add the fragments we want...
mSectionsPagerAdapter.addFragment(new Guid1());
mSectionsPagerAdapter.addFragment(new Guid2());
mSectionsPagerAdapter.addFragment(new Guid3());

// ...and set up our own adapter on the viewpager
mViewPager.setAdapter(mSectionsPagerAdapter);

А вот формула, которую я использую для создания своих собственных адаптеров:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

    /**Adds a fragment and corresponding title to the list*/
    public void addFragment(Fragment f, String title){
        mFragmentList.add(f);
        mFragmentTitleList.add(title);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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