Java 单击对话框(viewpager)时,在另一个片段上方替换一个片段
我试图打开一个片段,这时在另一个片段中单击了一个对话框。我正在使用ActionBarSherlock和Tab。我的片段附加在查看页面中。我几乎完成了这项工作。但我无法替换视图寻呼机中的新片段。我犯了个错误。我读线程。解决办法还不清楚 错误: 10-18 21:34:40.379:E/AndroidRuntime(19618):致命异常:main 10-18 21:34:40.379:E/AndroidRuntime(19618): java.lang.IllegalArgumentException:找不到id为0x7f040032的视图 (com.example.actionBarTestWithherLock:id/pager)用于片段 AllContactsFragment{41fd4ba0#0 id=0x7f040032}10-18 21:34:40.379: E/AndroidRuntime(19618):在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903) 我有三个与寻呼机关联的片段,分别命名为FragmentTab1、FragmentTab2和FragmentTab3 我的main活动和碎片适配器如下所示:Java 单击对话框(viewpager)时,在另一个片段上方替换一个片段,java,android,android-fragments,actionbarsherlock,android-viewpager,Java,Android,Android Fragments,Actionbarsherlock,Android Viewpager,我试图打开一个片段,这时在另一个片段中单击了一个对话框。我正在使用ActionBarSherlock和Tab。我的片段附加在查看页面中。我几乎完成了这项工作。但我无法替换视图寻呼机中的新片段。我犯了个错误。我读线程。解决办法还不清楚 错误: 10-18 21:34:40.379:E/AndroidRuntime(19618):致命异常:main 10-18 21:34:40.379:E/AndroidRuntime(19618): java.lang.IllegalArgumentExcepti
public class MainActivity extends SherlockFragmentActivity {
ActionBar.Tab Tab1, Tab2, Tab3, Tab4;
private Context context = this;
// view pager
// Declare Variables
ActionBar actionBar;
ViewPager mPager;
Tab tab;
FragmentAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// set application in portrait mode
ActivityHelper.initialize(this);
actionBar = getSupportActionBar();
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Locate ViewPager in activity_main.xml
mPager = (ViewPager) findViewById(R.id.pager);
// add an adapter to pager
mPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(),
mPager, actionBar));
addActionBarTabs();
}
private void addActionBarTabs() {
String[] tabs = { "Tab 1", "Tab 2", "Tab 3" };
for (String tabTitle : tabs) {
ActionBar.Tab tab = actionBar.newTab().setText(tabTitle)
.setTabListener(tabListener);
actionBar.addTab(tab);
}
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
}
private ActionBar.TabListener tabListener = new ActionBar.TabListener() {
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
};
class FragmentAdapter extends FragmentPagerAdapter implements
ViewPager.OnPageChangeListener {
private ViewPager mViewPager;
final int TOTAL_PAGES = 3;
public FragmentAdapter(FragmentManager fm, ViewPager pager,
ActionBar actionBar) {
super(fm);
this.mViewPager = pager;
this.mViewPager.setOnPageChangeListener(this);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return FragmentTab1.newInstance();
case 1:
return FragmentTab2.newInstance();
case 2:
return FragmentTab3.newInstance();
default:
throw new IllegalArgumentException(
"The item position should be less or equal to:"
+ TOTAL_PAGES);
}
}
@Override
public int getCount() {
return TOTAL_PAGES;
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
}
}
现在,在我的第一个选项卡FragmentTab1中,当一个按钮单击时,我会打开一个自定义对话框。选择对话框选项后,我想替换FragmentTab1中的新片段所有ContactsFragment
FragmentTab1片段类:
public class FragmentTab1 extends SherlockFragment implements OnClickListener {
Button btnTest;
ViewPager pager;
LinearLayout layoutBlockNumbers;
LinearLayout layoutContact, layoutCallLog, layoutSMSLog, layoutManually;
Context context;
CustomizedDialog dialog;
private static final int CONTACT_PICKER_RESULT = 1001;
private static final String DEBUG_TAG = "Contact List";
private static final double RESULT_OK = -1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragmenttab1, container,
false);
layoutBlockNumbers = (LinearLayout) rootView
.findViewById(R.id.layoutAddBlockNumbers);
layoutBlockNumbers.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
if (v == layoutCallLog) {
dialog.dismiss();
// want to replace new fragment at position 0 in pager
// problem is here ??? how to open new fragmnet
Fragment allContactsFragment = AllContactsFragment.newInstance();
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
transaction.addToBackStack(null);
transaction.replace(R.id.pager, allContactsFragment).commit();
}
if (v == layoutBlockNumbers) {
// open a dialog
showDialog();
} else if (v == layoutContact) {
openContactList();
dialog.dismiss();
} else if (v == layoutSMSLog) {
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setUserVisibleHint(true);
}
// open a dialog
private void showDialog() {
dialog = new CustomizedDialog(getActivity());
dialog.setContentView(R.layout.dialog_add_number_type);
dialog.setTitle("Add Black List Number");
//initialize all linear layouts in dialog
layoutCallLog = (LinearLayout) dialog.findViewById(R.id.layoutCallLog);
layoutContact = (LinearLayout) dialog.findViewById(R.id.layoutContact);
layoutSMSLog = (LinearLayout) dialog.findViewById(R.id.layoutSMSLog);
layoutManually = (LinearLayout) dialog
.findViewById(R.id.layoutManually);
// add listener to several linear layout
layoutContact.setOnClickListener(this);
layoutCallLog.setOnClickListener(this);
layoutSMSLog.setOnClickListener(this);
layoutManually.setOnClickListener(this);
dialog.show();
}
public static Fragment newInstance() {
Fragment f = new FragmentTab1();
return f;
}
}
activity_main.xml如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</android.support.v4.view.ViewPager>
</RelativeLayout>
谁能帮我解决这个问题?抱歉,代码太多。我不确定您是否可以按自己的方式做事。
ViewPager
的设置方式与普通容器/片段的设置方式不同。在ViewPager
中,您没有使用片段事务来添加片段,而是使用一个适配器从备份列表加载片段实例
然后,替换片段将按如下方式工作:
(1) 创建要添加的片段的实例
(2) 将该片段添加到支持您的PagerAdapter
(3) 显示新片段
(4) 把旧的拿走
在当前项目中实现此功能的问题是适配器的设置。目前,您使用的开关状态只能返回固定数量的片段。您的适配器应该像这样设置
class MyPageAdapter extends FragmentPagerAdapter{
private List<Fragment> fragments
public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
类MyPageAdapter扩展了FragmentPagerAdapter{
私有列表片段
公共MyPageAdapter(FragmentManager fm,列出片段){
超级(fm);
this.fragments=片段;
}
@凌驾
公共片段getItem(int位置){
返回此.fragments.get(位置);
}
@凌驾
public int getCount(){
返回此.fragments.size();
}
}
然后,您可以向适配器类添加一个方法来添加或删除新片段。如果您知道要替换的片段的索引,那么完成此操作应该非常简单。您所要做的就是创建联系人片段的新实例,将其添加到数组或列表中。解释ViewPager
如何处理添加/删除新内容,以及如何确保显示新片段 读了这篇文章后,我找到了答案
我只是在fragmenttab1.xml的顶部布局中添加了一个ID android:ID=“@+ID/FragmentTableLayout1。然后调用
新片段与往常一样:
Fragment allContactsFragment = AllContactsFragment.newInstance();
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
transaction.addToBackStack(null);
// use this id to replace new fragment
transaction.replace(R.id.fragmentTabLayout1, allContactsFragment).commit();
我在哪里添加了片段?在我的场景中添加了什么?我很困惑。考虑我是一个初级程序员。我已经添加了旧片段的列表,它工作得很好。但是我的问题是如何在对话框OnCutt事件中打开新的片段?@ rARWU将从OnCutter侦听器的回调中添加新的片段。