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();
}
}