2015-04-07 26 views
1

我有一个片段,我想将整个片段设置为我的活动的根视图。我准备好了一切,我正在以编程方式实例化我的片段。我试过(在我的活动):如何在Android中将活动的根视图设置为片段?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FeedFragment fragment = [...]; 
    setContentView(fragment.getView()); 
} 

但我有一个空指针异常。换句话说,我如何让我的片段像一个活动一样行事?我只针对ICS +,如果它有所不同,我不需要支持旧版本。

回答

1

片段,通过设计,旨在帮助您再利用屏幕空间,因此,碎片必须存在一个容器内的一个工具。因此,尽管片段在技术上不能成为根视图,但您可以让片段成为Activity内唯一的视图。为此,您应该在片段的onCreateView()方法内以编程方式夸大片段的视图。那么你可以在你的活动的布局XML是这样的:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/frame_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<com.package.fragment_name 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

</FrameLayout> 

然后,你的活动范围内,所有你需要做的是:

setContentView(R.layout.main); 

因为,该片段在布局定义xml,它不能从活动的布局中移除(尽管布局本身可以改变)并且与它相关联。

此外,请注意,根视图是FrameLayout,而不是片段本身。但以这种方式,你的片段可以与活动联系在一起。但不要忘记,片段仍然保留与活动分开的生命周期。

编辑:如果您需要以编程方式创建片段的实例,你要做的:

getFragmentManager().beginTransaction().add(R.id.frame_layout, your_fragment).commit(); 

这是编程方式添加您的片段的唯一途径。但是请记住,Fragment的布局与活动的布局没有关系。但是你可以使用Fragment的生命周期来表现与Activity类似的行为。

+0

正如我在问题中写的,我必须以编程方式创建片段实例。 –

+0

编辑答案。如果您仍然遇到错误,您可以发布logcat吗?代码看起来不错。 – ucsunil

+0

它工作正常。谢谢,这正是我所需要的。 –

2

试试这个

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.all_lecturer_frag, container, false); 

    ...... 

    return rootView; 
    } 
+0

但我需要在Fragment实例上设置一些属性。代码中的''部分实际上设置了我的属性。 –

1
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
super.onCreate(savedInstanceState); 
    setContentView(R.layout.xxx); 
    //initializations...  
    if (savedInstanceState == null) { 
     // During initial setup, plug in the fragment. 
     YourFragment details = new YourFragment(); 
     getFragmentManager().beginTransaction().add(R.id.your_root_frame_layout, details).commit(); 
    } 
} 
+0

1)什么是R.layout.xxx?它是一个空的XML文件吗? 2)没有片段事务干扰后退按钮? –

+0

1)可以用带your_root_frame_layout的FrameLayout(match_parent)清空XML。尝试覆盖后面的按钮(onBackPressed(){....}) –

相关问题