Android快速片段替换导致滞后

时间:2018-05-31 15:52:07

标签: android android-fragments

我目前正在开发类似测验的应用程序。

在这个应用程序中,我有一个名为QuizActivity的活动。

在QuizActivity中,我想一个接一个地显示问题,并允许用户在它们之间导航。 所以我考虑建立一个问题片段。

在布局中,我插入了组件以显示问题(Cardviews,EditTexts和一个ImageView)。 在代码中,我在创建视图时将数据加载到视图中。

当用户尝试非常快地切换片段时,问题就出现了,输入开始变慢,一切都开始滞后。

这是我的代码:

片段布局

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/question_img"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:scaleType="centerCrop" />

        <AutoCompleteTextView
            android:id="@+id/AutoreTxtView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="16dp"
            android:fontFamily="sans-serif"
            android:hint="Autore"
            android:paddingLeft="15dp"
            android:paddingRight="15dp" />

        <AutoCompleteTextView
            android:id="@+id/OperaTxtView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="16dp"
            android:fontFamily="sans-serif"
            android:hint="Opera"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:singleLine="true" />

        <AutoCompleteTextView
            android:id="@+id/LuogoTxtView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="16dp"
            android:fontFamily="sans-serif"
            android:hint="Luogo"
            android:paddingLeft="15dp"
            android:paddingRight="15dp" />

        <AutoCompleteTextView
            android:id="@+id/AnnoTxtView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="16dp"
            android:fontFamily="sans-serif"
            android:hint="Anno"
            android:paddingLeft="15dp"
            android:paddingRight="15dp" />

        <AutoCompleteTextView
            android:id="@+id/MovimentoTxtView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="16dp"
            android:hint="Movimento"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:layout_marginBottom="8dp"/>
    </LinearLayout>

</android.support.v7.widget.CardView>

片段代码

    public class Question extends Fragment {

    Risposta risposta;

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

    public static Question newInstance(Risposta risposta) {
        Question fragment = new Question();
        Bundle args = new Bundle();
        args.putString("Key",risposta.getKey());
        args.putString("Opera",risposta.getOpera());
        args.putString("Autore",risposta.getAutore());
        args.putString("Anno_Inizio",risposta.getAnno_inizio());
        args.putString("Anno_Fine",risposta.getAnno_fine());
        args.putString("Movimento",risposta.getMovimento());
        args.putString("Luogo",risposta.getLuogo());
        args.putByteArray("Foto",risposta.getFoto());
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            risposta = new Risposta(getArguments().getString("Opera"),
                    getArguments().getString("Autore"),
                    getArguments().getString("Anno_Inizio"),
                    getArguments().getString("Anno_Fine"),
                    getArguments().getString("Luogo"),
                    getArguments().getString("Movimento"));
            risposta.setFoto(getArguments().getByteArray("Foto"));
            risposta.setKey(getArguments().getString("Key"));
        }

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.prova, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //final CardView card = view.findViewById(R.id.question_img_card);
        ImageView img = view.findViewById(R.id.question_img);

        Bitmap bmp = BitmapFactory.decodeByteArray(risposta.getFoto(), 0, risposta.getFoto().length);
        img.setImageBitmap(bmp);

        EditText Autore = view.findViewById(R.id.AutoreTxtView);
        EditText Opera = view.findViewById(R.id.OperaTxtView);
        EditText Anno = view.findViewById(R.id.AnnoTxtView);
        EditText Movimento = view.findViewById(R.id.MovimentoTxtView);
        EditText Luogo = view.findViewById(R.id.LuogoTxtView);
        Autore.setText(risposta.getAutore());
        Opera.setText(risposta.getOpera());
        Anno.setText(risposta.getAnno_fine());
        Movimento.setText(risposta.getMovimento());
        Luogo.setText(risposta.getLuogo());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

NextFragment代码

mFragmentManger.beginTransaction()
                            .replace(R.id.FragContainer, listaIstanzeQuestion.get(question_index))
                            .addToBackStack("key_" + question_index)
                            .commit();

简单的PopBackStack()返回上一个片段

mFragmentManger.popBackStack();

有没有更有效的方法来获得我正在寻找的结果? 我已经尝试清理代码并减少布局组件。如果我删除一些布局组件,性能会提高,但我需要它们。

感谢。

0 个答案:

没有答案