如何通过视图ID获取FragmentManager?

时间:2011-12-21 01:21:53

标签: android android-fragments

如何获取视图的FragmentManager

假设我有这样的布局:

<?xml version="1.0" encoding="utf-8"?>
...
<fragment android:name="com.example.MyFragment"
        android:id="@+id/thefragmentsid" >
</fragment>
...

这是我的伪代码(我知道甚至不存在FragmentView,但我猜你知道我的意思)

FragmentView fw = (FragmentView) activity.findViewById( R.id.thefragmentsid );
FragmentManager goal = fw.getFragment().getFragmentManager();

这是一个用例示例:

public class MyFragment extends Fragment{
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate( R.layout.my_fragments_view, container, false );
    }
}

public class MainActivity extends FragmentActivity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById( R.id.thefragmentsid ).setOnTouchListener( new OnTouchListener(){
            @Override
            public boolean onTouch( View v, MotionEvent event ){
                FragmentView fw = (FragmentView) findViewById( R.id.thefragmentsid );
                FragmentManager fm = fw.getFragment().getFragmentManager();
                // Do something with the fragment manager
                return false;
            }
        } );
    }
}

编辑:我无法以任何我知道的方式访问任何Fragment - 对象。也许有一种隐藏的方式,但正是因为我的要求!

下一次编辑:(之后只是为了完成问题)我正在使用Google支持套餐!

PS:我不想给太多涉及的信息,因为这是一个普遍的问题,需要一般的答案,偶尔会出现。

2 个答案:

答案 0 :(得分:3)

好吧,我知道这是我自己的错误。我认为它必须是一个名为getFragmentManager()的函数,但确实是错误。

因为我使用Googles支持包,所以正确的函数被称为getSupportFragmentManager()

但是必须说有一个很大的陷阱,因为在Fragment内部,即使使用支持包,也可以使用Fragment函数getFragmentManager()但在{{1}内部它突然FragmentActivity

我承认这是一个很大的耻辱,特别是我认为这不是必要的信息,我使用支持包。我认为这会让问题更加笼统,但我发现我永远不会保留任何信息。对于未来的问题:)

答案 1 :(得分:0)

http://developer.android.com/guide/topics/fundamentals/fragments.html

在代码中创建片段,并按照为活动分配视图的方式为其分配视图。要将片段添加到XML中,请使用您在代码中创建的片段。

 <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />

然后在你的代码中,给它一个视图

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}

现在您的代码片段已经存在,您可以使用:

getActivity().getFragmentManager();

getActivity是获取Activity所属Fragment的简写。有可能Fragment未附加Activity

因此,请等到onActivityCreated或查看getActivity是否为空。