2014-04-02 98 views
1

您好我正在开发一个使用3片段(片段A,B,C)在viewpager和tabs内的android应用,viewpager可以正常工作。片段A包含列表视图,当用户单击某个项目时,应用程序会打开一个包含所选项目信息的片段对话框。该对话框有一个名为“添加到收藏夹”的按钮。现在,我想这样做,当用户按下按钮:从另一个片段在viewpager中显示片段

  1. 关闭碎片对话框
  2. 显示视图寻呼机
  3. 里面的片段B,从对话片段将信息发送到B片段

我怎样才能做到这一点?

这是我的代码部分:

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

} 
} 

回答

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

} 

下,并创建一个接口

创建以下通讯。java的

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

MainAcitvity

片段实现通讯创建此通讯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

这将类似于以下

@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显示下一个选项卡,以及

,并保留任何简单的方法insdie的FragmentB像下面

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

我希望这将有助于:)快乐编码

+0

谢谢沙工作正常,如果试图传递信息,我需要创建另一个实例FragmentB?如果我在OnActivityCreated上创建了一个Bundle,这将会得到Null,因为当应用程序启动这个片段的bundle时没有任何值 – deleon

+0

是的。你需要创建一个实例,如果它不起作用,请尝试使它成为一个“静态”。您将从“DialogFrament”仪式创建包。所以如果你传递任何东西,它不会为空。否则检查一个条件为null @deleon –

2

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

2.As我的理解正确的话,在你的片段创建这样一个方法,

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

调用它在你的按钮onClick()FirstFragment.newInstance("Fragment, Instance 1");

3.创建Interface在你DialogFragment方法可以调用将任何你想要的数据传回给创建所述DialogFragment的Fragment。还要将您的片段设置为目标,例如myFragmentDialog.setTargetFragment(this, 0)。然后在对话框中,使用getTargetFragment()获取目标片段对象,并将其转换为您创建的接口。现在您可以使用((MyInterface)getTargetFragment()).methodToPassData(data)传递数据。 欲了解更多信息:link

+0

我这样做。 ..看我的第一堂课。我没有问题的视图寻呼机中的片段,我的问题是如何显示位置B(片段)时,用户按下对话框片段内的按钮 – deleon

+0

您是否尝试建议的解决方案,调用您的按钮内的给定方法onClick ()? –

+0

Zusee Weekin,是的,我做了,但没有工作 – deleon