当前位置: 首页 > 知识库问答 >
问题:

单击对话框时,替换位于另一个片段之上的片段(视页)

邓鸿彩
2023-03-14

我试图打开一个片段,当一个对话框被点击在另一个片段。我在用ActionBarSherlock和Tab。我的片段附在视图页中。我几乎完成了这项工作。但是我不能替换视图页内的新片段。我有个错误。我读了这里的线程。解决办法还不清楚。

10-18 21:34:40.379:e/AndroidRuntime(19618):致命异常:main 10-18 21:34:40.379:e/AndroidRuntime(19618):java.lang.illegalArgumentException:未找到ID0x7f040032(com.example.actionBartestWithSherlock:id/pager)for fragment AllContactsFragment{41fd4BA0#0 id=0x7f040032}的视图

我有三个与分页程序相关的片段,分别名为FragmentTab1、FragmentTab2和fragmenttab3。

我的MainActivity&FragmentAdapter如下所示:

  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中的新片段AllContactsFragment。

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

有人能帮我解决这个问题吗?很抱歉有这么多代码。

共有1个答案

司空兴为
2023-03-14

我不确定你能按你想的方式做事。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(); 
    } 
}

然后,您只需向适配器类添加一个方法即可添加或移除新片段。如果您知道要替换的片段的索引,那么完成这个任务应该非常容易。您所要做的就是创建联系人片段的新实例,并将其添加到数组或列表中。本文将解释viewpager如何处理新内容的添加/删除,以及如何确保显示新片段。

 类似资料:
  • 我有一个活动和两个片段。片断a和片断b。 我需要实现像,最初碎片应该在那里。在之后,单击FragmentB应该在那里。 我的第二段代码:

  • 我试图通过活动中按钮的onclick事件将一个主片段替换为另一个片段,但该片段恰好悬停在主片段上。 这是我的密码

  • 问题内容: 我在小组活动中有一个片段,我想用另一个片段替换它: 在不使用活动组的情况下作为单独的项目完成时,它工作正常,当控件进入getview()时,每件事在日志猫中都可以正常工作,但是没有视图可见,甚至没有任何异常出现,我希望将书详细信息片段由部分详细信息片段代替。 图书详细信息片段的XML具有id book_description_fragment,而部分描述片段的xml具有id secti

  • 我正在通过片段“A”调用从服务器获取数据。当我用“B”替换“A”时,在从“B”返回到“A”之后,每次都会调用片段“A”,因此每次都会生成HTTPGET。如何避免这种情况,并在活动中重用类似REORDER_to_FRONT的片段? 我正在使用此代码替换为新片段 当我反压时,

  • 我正在尝试学习如何在android中实现片段。因此,我在activity_main中创建了两个按钮和一个片段。xml。如果我点击第一个按钮,片段1应该充气,同样,如果我点击第二个按钮,片段2应该充气。 但是问题是它没有替换片段。当我调试代码时,在View.class中执行clecle()方法返回false。 LogCat中也没有错误。 我无法找出代码的问题。 这里是主要活动。xml 这是fragm

  • 我读了DialogFragment,然后把它做成这样的一对一。 在另一个SherlockFragment中,我接下来制作: 但是doPositiveClick()、doNegativeClick()方法希望是静态的,这对我来说不好。