2016-05-13 125 views
2

我试图将一个片段加载为活动的默认视图,但我只是得到一个空白屏幕和巨大的内存泄漏。活动启动时的默认片段

活动文件onCreate方法:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_login); 

    if (savedInstanceState == null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     int fragmentTransaction = fragmentManager.beginTransaction() 
       .add(R.id.login_screen_fragment, new FragmentLogin()) 
       .commit(); 
    } 
} 

的XML为活动:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".LoginActivity"> 

    <fragment 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/login_screen_fragment" 
     class="com.test.project.FragmentLogin" 
    /> 

    <fragment 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/forgotten_password_fragment" 
     class="com.test.project.FragmentForgottenPassword" 
    /> 
</FrameLayout> 

,将片段类(相关部分):

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    final View view = inflater.inflate(R.layout.fragment_login, container, false); 
    final Activity activity = getActivity(); 

    ... code ... 

    return view; 
} 

我跟着从指令从一个不同的问题中引导某人提出的建议,但我必须做某些事情可怕的错误。有任何想法吗?

+0

当你定义在布局''元素,你并不需要在你的代码动态加载的。 –

+0

@MikeM。我在哪里做这个? – mwieczorek

+0

“if”块是动态实例化和处理FragmentLogin实例的。 –

回答

0

只需用FrameLayout替换片段元素,然后你就可以看到你的片段。

0

如果您想以编程方式添加碎片,然后删除您的Framelayout中的<Fragment>并添加一些ID。

它应该是这样的:

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

xml文件

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

您的活动

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

setContentView(R.layout.activity_login); 

if (savedInstanceState == null) { 
    FragmentLogin f1= new FragmentLogin(); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.changeFragment, f1); 
    fragmentTransaction.commit(); 

    } 
} 
1

我是新来的Android和我跑进同样的问题。这是我如何修复我的。

因此,在您的onCreate方法中,使用FragmentManager类中的getSupportFragmentManager(),然后分别声明FragmentTransaction。见下文。我为我的情况做了这件事,它的工作。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

setContentView(R.layout.activity_login); 

if (savedInstanceState == null) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.login_screen_fragment, new FragmentLogin()); 
    fragmentTransaction.commit(); 
} 

希望这有助于解决您的问题。

真诚, sylvery