gpt4 book ai didi

android - 显示内容两次的 fragment

转载 作者:行者123 更新时间:2023-11-30 02:48:43 25 4
gpt4 key购买 nike

我将解释我的应用程序的结构:

Activity --> fragment A(在该 fragment (A) 中我有 3 个 fragment (B、C、D)(viewpager)) --> 在第一个 fragment (B) 中它包含一个 ListView 。该列表中的每个项目都会启动一个 fragment E。

所以我在这里遇到了一个问题。

当我第一次启动我的应用程序时,一切看起来都很好。

enter image description here

但是当 Fragment E 在屏幕上可见时,选项卡变得很奇怪,就像:

enter image description here

是的!他们被复制了。当我点击 ListView 时,我从 Activity 中的回调提交 2 个 fragment 之间的转换:

    transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content_frame, PF);
transaction.addToBackStack(null);
transaction.commit();

当我想回到上一个 fragment 时:

        getFragmentManager().popBackStack();

是否重新创建了之前的 fragment ?我能做些什么来解决它?

更新 --代码: Activity :

public class MainActivity extends FragmentActivity implements
IslamToolsFragment.OnToolsSelectedListener {
FragmentTransaction transaction;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (findViewById(R.id.content_frame) != null) {
if (savedInstanceState != null) {
return;
}

PagerActivity firstFragment = new PagerActivity();

getSupportFragmentManager().beginTransaction()
.add(R.id.content_frame, firstFragment).commit();
}
}

@Override
public void OnToolSelected(int position) {
// TODO Auto-generated method stub
switch (position) {
case 0:
PrayerFragment PF = new PrayerFragment();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content_frame, PF);
transaction.addToBackStack(null);
transaction.commit();
break;
case 1:
QiblaFragment QF = new QiblaFragment();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content_frame, QF);
transaction.addToBackStack(null);
transaction.commit();
break;
}
}

fragment A(包含 3 个 fragment ):

public class PagerActivity extends Fragment implements ActionBar.TabListener {
int NUM_PAGES = 5;
ActionBar actionBar;
private ViewPager mPager;
AppSectionsPagerAdapter mAppSectionsPagerAdapter;

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mPager.setAdapter(null);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
return;
} else {

actionBar = this.getActivity().getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(
getChildFragmentManager());
mPager.setAdapter(mAppSectionsPagerAdapter);
int icons[] = { R.drawable.ic_action_storage,
R.drawable.ic_action_overflow, R.drawable.ic_action_person };
mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {

actionBar.setSelectedNavigationItem(position);
}
});

for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {

actionBar.addTab(actionBar.newTab().setIcon(icons[i])
.setTabListener(this));

}
}
}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View tabsview = inflater.inflate(R.layout.pager_activity, container,
false);
mPager = (ViewPager) tabsview.findViewById(R.id.pager);

return tabsview;

}

fragment B:

public class IslamToolsFragment extends Fragment {
OnToolsSelectedListener mCallback;

ListView islamtools;
Fragment PF = new PrayerFragment();

public interface OnToolsSelectedListener {
public void OnToolSelected(int position);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View islamtoolsview = inflater.inflate(R.layout.lvislamtools,
container, false);
if (savedInstanceState != null) {
return islamtoolsview;
}
islamtools = (ListView) islamtoolsview.findViewById(R.id.lvislamtools);
String[] title = { "Prayer Times", "Qibla", "Ahadith", "Quran",
"Hijri Calendar", "99 Names" };
IslamToolsAdapter ITA = new IslamToolsAdapter(this.getActivity(), title);
islamtools.setAdapter(ITA);
islamtools.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
mCallback.OnToolSelected(arg2);
}

});
return islamtoolsview;
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (OnToolsSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}

}

谢谢!它与保存的实例状态有关吗?

最佳答案

你的代码设计有点错误, fragment 实际上是 Activity 的 fragment ,在这种情况下创建一个包含更多 fragment 的 fragment 对我来说没有意义,你应该做的是为 viewpager 创建一个 Activity 和将您的 3 个 fragment 放入该 Activity 中。

我有一个类似的应用程序,这就是我处理选项卡之间导航的方式:

pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}

@Override
public void onPageScrollStateChanged(int state) {

}

上面的代码改变了操作栏的选择项,但没有改变 View 分页标签下面的 View ,你需要执行以下操作来做到这一点:

     @Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
pager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

关于android - 显示内容两次的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24580513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com