Java 当设置标记时,Android片段会奇怪地消失

Java 当设置标记时,Android片段会奇怪地消失,java,android,android-fragments,tags,Java,Android,Android Fragments,Tags,我在PageView中有两种类型的片段。第一个是TextFragment,包含TextView,并在其上设置了标记。其他的是ImageFragments,包含ImageView,并且没有标记。从asset文件夹异步加载图像 问题是,第二个片段(有时还有其他片段)没有显示内容,或者内容只出现了一段时间,然后就消失了。当我删除/注释设置了标记的行时,一切都开始正常工作 您知道如何使片段正确显示,即使设置了标记 下面是代码(使用appcompat)。请记住,标记是必需的(在我的应用程序中),尽管代码中

我在
PageView
中有两种类型的
片段。第一个是
TextFragment
,包含
TextView
,并在其上设置了标记。其他的是
ImageFragment
s,包含
ImageView
,并且没有标记。从
asset
文件夹异步加载图像

问题是,第二个片段(有时还有其他片段)没有显示内容,或者内容只出现了一段时间,然后就消失了。当我删除/注释设置了标记的行时,一切都开始正常工作

您知道如何使片段正确显示,即使设置了标记

下面是代码(使用appcompat)。请记住,标记是必需的(在我的应用程序中),尽管代码中没有查询到它

活动\u main.xml

fragment_text.xml


TextFragment.java

public类TextFragment扩展片段{
公共文本片段(){
}
静态TextFragment newInstance(FragmentManager FragmentManager,字符串标记){
TextFragment实例=新建TextFragment();
碎片管理器
.beginTransaction()

.replace(R.id.core\u pager,instance,tag)//我认为在replace()调用中将片段实例显式添加到FragmentManager会导致意外行为(正如您已经注意到的那样)。我建议您实际上不需要这一行。(可能我错了)。我猜您希望在TextFragment实例上设置该标记,以便以后检索。您是否可以从FragmentStatePagerAdapter实例中检索该TextFragment实例,只需从中获取第0项即可?即创建FragmentStatePagerAdapter实例,保存对其的引用,然后将其设置为ViewPager。我认为在replace()调用中将片段实例显式添加到FragmentManager会导致意外行为(正如您已经注意到的)。我想建议您实际上不需要这一行。(可能我错了)。我猜您希望在TextFragment实例上设置该标记,以便以后检索。您是否可以从FragmentStatePagerAdapter实例中检索该TextFragment实例,只需从中获取第0项即可?即创建FragmentStatePagerAdapter实例,保存对其的引用,然后将其设置为寻呼机。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context="example.com.testfragment.MainActivity">

    <android.support.v4.view.ViewPager
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/core_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</RelativeLayout>
public class MainActivity extends AppCompatActivity {

    private static final String TEXTFR_TAG = "TEXTFR_TAG";
    static final String MYDATAFOLDER = "mydata";

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

        ViewPager viewPager = (ViewPager) findViewById(R.id.core_pager);
        final String[] imgs = getImages();
        viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return imgs.length + 1;
            }

            @Override
            public Fragment getItem(int position) {
                switch (position) {
                    case 0:
                        return TextFragment.newInstance(getSupportFragmentManager(), TEXTFR_TAG);
                    default:
                        return ImageFragment.newInstance(imgs[position - 1]);
                }
            }

        });

    }

    private String[] getImages() {
        try {
            return this.getAssets().list(MYDATAFOLDER);
        } catch (IOException e) {
            return new String[0];
        }

    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@android:color/darker_gray">
    <TextView android:layout_width="match_parent" android:layout_height="match_parent"
              android:id="@+id/textfragment_textview"/>
</LinearLayout>
public class TextFragment extends Fragment {

    public TextFragment() {
    }

    static TextFragment newInstance(FragmentManager fragmentManager, String tag) {
        TextFragment instance = new TextFragment();
        fragmentManager
                .beginTransaction()
                .replace(R.id.core_pager, instance, tag)      // <--- REMOVING THIS FIXES THE PROBLEM
                .commit();
        return instance;
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_text, container, false);
        ((TextView)root.findViewById(R.id.textfragment_textview)).setText("SOME TEXT");
        return root;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@android:color/white">
    <ImageView android:layout_width="match_parent" android:layout_height="match_parent"
               android:id="@+id/imagefragment_imageview"/>
</LinearLayout>
public class ImageFragment extends Fragment {

    private static final String ARG_IMG = "ARG_IMG";

    public ImageFragment() {
    }

    static ImageFragment newInstance(String imagePath) {
        ImageFragment instance = new ImageFragment();
        Bundle args = new Bundle();
        args.putString(ARG_IMG, imagePath);
        instance.setArguments(args);
        return instance;
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_image, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        if(view == null) {
            return;
        }

        final Bundle args = getArguments();
        final ImageView iv = (ImageView) view.findViewById(R.id.imagefragment_imageview);

        new AsyncTask<Void, Void, Drawable>() {
            @Override
            protected Drawable doInBackground(Void... voids) {
                String imgFile = args.getString(ARG_IMG);
                try {
                    Context context = getContext().getApplicationContext();
                    return Drawable.createFromStream(context.getAssets().open(MainActivity.MYDATAFOLDER + '/' + imgFile), null);
                } catch (Exception e) {
                    Log.e("MyAPP", "Error: ", e);
                }
                return null;
            }

            @Override
            protected void onPostExecute(Drawable drawable) {
                if(drawable != null) {
                    iv.setImageDrawable(drawable);
                } else {
                    Log.d("MyAPP", "No drawable");
                }
            }

        }.execute();
    }
}