通过Fragment中的Intent启动片段

时间:2012-03-22 22:52:43

标签: android android-intent android-fragments

我想发布一个新片段来查看一些数据。目前,我有一个主要活动,其中包含一堆操作栏选项卡,每个选项卡都是一个片段。所以,在一个标签片段中,我有一个按钮,chartButton。我的onclicklistener都设置好了,这是onClick方法:

public OnClickListener chartsListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent chartFragment = new Intent();
        startActivity(chartFragment);   
    }
};

现在,正如我所说,这个监听器属于扩展Fragment的类。所以,我想通过意图更换整个屏幕来启动一个新的片段(chartsFragment)。当用户点击回来时,它会将它们带回标签和主要活动。这是我的图表片段:

public class chartsFragment extends Fragment {

    public View onCreateView() {
        //LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return (inflater.inflate(R.layout.chartfragment, null));
    }
}

我正在处理的当前错误:“android.content.ActivityNotFoundException:找不到处理Intent {}的活动”。这很好,我知道我可以使用getActivity()。startActivity(chartsFragment),但这会导致相同的错误。我想我在这里寻找的是,如何从片段中启动一个导致打开新片段的意图?

4 个答案:

答案 0 :(得分:50)

您的问题的答案很简单:用新的Fragment替换当前的Fragment并将事务推送到backstack。这样可以保留后退按钮的行为......

创建一个新的Activity实际上打败了使用片段的全部目的......非常适得其反。

@Override
public void onClick(View v) {
    // Create new fragment and transaction
    Fragment newFragment = new chartsFragment(); 
    // consider using Java coding conventions (upper first char class names!!!)
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    // Replace whatever is in the fragment_container view with this fragment,
    // and add the transaction to the back stack
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(null);

    // Commit the transaction
    transaction.commit(); 
}

http://developer.android.com/guide/components/fragments.html#Transactions

答案 1 :(得分:19)

您无法打开新片段。片段需要始终由活动托管。如果片段处于相同的活动(例如制表符),那么后退键导航将变得棘手我假设您要打开具有该片段的新屏幕。

因此,您只需创建一个新活动并将新片段放在那里。然后,该活动将通过活动类明确地或通过intent filter隐式地对意图做出反应。

答案 2 :(得分:5)

试试这可能会对你有所帮助:

public void ButtonClick(View view) {
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit();
}

答案 3 :(得分:0)

试试这可能会对你有所帮助:

private void changeFragment(Fragment targetFragment){

    getSupportFragmentManager()
         .beginTransaction()
         .replace(R.id.main_fragment, targetFragment, "fragment")
         .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
         .commit();

}