从另一个片段在viewpager中显示片段

时间:2014-04-02 04:16:08

标签: android android-fragments android-viewpager

你好我正在使用viewpager和tabs中的3片段(片段A,B,C)开发一个Android应用程序,viewpager工作正常。片段A包含列表视图,当用户单击项目时,应用程序打开片段对话框,其中包含有关所选项目的信息。该对话框有一个名为“添加到收藏夹”的按钮。现在我想在用户按下按钮时执行此操作:

  1. 关闭片段对话框
  2. 在视图寻呼机
  3. 中显示片段B.
  4. 将对话框片段中的信息发送到片段B
  5. 我该怎么做?

    这是我的代码的一部分:

    * MainFragmentActivity * (这很好用)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tube);
    
        // Set up the action bar.
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
    
        // When swiping between different sections, select the corresponding
        // tab. We can also use ActionBar.Tab#select() to do this if we have
        // a reference to the Tab.
        mViewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });
    
    
        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
    
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
    }
    
    @Override
    public void onTabSelected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }
    
    @Override
    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }
    
    @Override
    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }
    
    
    public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                FragmentA a = new FragmentA();
                Bundle args1 = new Bundle();
                args1.putInt(FragmentA.ARG_SECTION_NAME , position + 1);
                a.setArguments(args1);
                return a;
    
            case 1:
                FragmentB b= new FragmentB();
                Bundle args2 = new Bundle();
                args2.putInt(FragmentB.ARG_SECTION_NAME , position + 2);
                b.setArguments(args2);
                return b;
    
            case 2:
                FragmentC c= new FragmentC();
                Bundle args3 = new Bundle();
                args3.putInt(FragmentC.ARG_SECTION_NAME , position + 3);
                c.setArguments(args3);
                return c;
    
              default:
                  return null;
            }
        }
    

    这是片段对话

    * FragmentDialogView *

    public class FragmentDialogView extends DialogFragment implements OnClickListener {
    
    private static final int REAUTH_ACTIVITY_CODE = 0;
    private String videoId;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    
        Bundle mArgs = getArguments();
    
        View view = (View) inflater.inflate(R.layout.fragment_dialog_view, container, false);
    
        //Buttons
        Button button = (Button) view.findViewById(R.id.button_one);
        button.setOnClickListener(this);
        buttonDownload.setOnClickListener(this);
    
        return view;
    }
    
    @Override
    public void onSaveInstanceState(Bundle bundle) {
        super.onSaveInstanceState(bundle);
    }
    
    @Override
    public void onResume() {
        super.onResume();
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == REAUTH_ACTIVITY_CODE) {
    
        }
    }
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_one:
    
                //Here it should show the fragment B inside the viewpager
    
            break;
        default:                
            break;
       }
    
    }
    }
    

2 个答案:

答案 0 :(得分:3)

要取消Dialog在您的DialogFragment课程中包含以下内容

private Dialog dialog;

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        dialog = new Dialog(getActivity());
        return dialog;
    }

    @Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button_one:

            dismiss();

        break;
    default:                
        break;
   }

}

创建界面

创建以下 Communicator.java

public interface Communicator {
    public void respond(int i);
}
MainAcitvity

实施 Communicator

在您的片段中创建此 Communicator instance

public class FragmentDialogView extends DialogFragment implements OnClickListener {

    private Communicator com;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        com = (Communicator) getActivity();
        btn.setOnClickListener(this);
        }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.btn:
            com.respond(1);
            break;
        }
    }

每当您点击 按钮 时,它会将int发送到位于 MainActivity <内的方法/ p>

将如下所示

@Override
public void respond(int i) {


        // Receive a bundle here
        // and pass the corresponding information to the FragmentB
        // here i'm receving an int and pass it to the FragmentB as a String

        FragmentManager fm = getFragmentManager();
        FragmentB fragment = (FragmentB) fm.findFragmentByTag("FragmentB");
        fragment.fromMainActivity(""+i);

        // If the above the one doesn't work keep the instance as Static and then try

        viewPager.invalidate();
        pagerAdapter.notifyDataSetChanged();
        viewPager.setCurrentItem(1, true);

    // Inside the setCuttentItem() method 0 first tab
    // 1 second tab
    // 2 third tab and so on
    } 

我在这里收到了一个int。您可以使用捆绑包来传递相应的信息。这将更改viewPager以显示下一个标签

并保留任何简单的方法,如下面的

中的FragmentB
public void fromMainActivity(String sample) {
    Toast.makeText(getActivity(), sample, duration).show();
}

我希望这会有所帮助:)快乐编码

答案 1 :(得分:2)

1.试试这个:getDialog()。dismiss();

2.据我所知,在你的片段中创建一个这样的方法,

public static FirstFragment newInstance(String text){
    FirstFragment f= new FirstFragment();
    return f;
}

onClick()按钮FirstFragment.newInstance("Fragment, Instance 1");中调用它,例如Interface

3.使用DialogFragment中的方法创建myFragmentDialog.setTargetFragment(this, 0)可以调用将您想要的任何数据传递回创建所述DialogFragment的Fragment。同时将Fragment设置为目标,例如((MyInterface)getTargetFragment()).methodToPassData(data)。然后在对话框中,使用getTargetFragment()获取目标片段对象并强制转换为您创建的接口。现在,您可以使用{{1}}传递数据。 有关详细信息:link