片段不起作用

时间:2012-05-31 06:14:58

标签: android android-layout android-fragments

我有这样的主要布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <Button
        android:id="@+id/btn_showdetails"
        android:layout_width="100dip"
        android:layout_height="wrap_content"
        android:layout_marginLeft="110dip"
        android:layout_marginTop="15dip"
        android:text="Show Details" />

    </LinearLayout>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" 
     android:id="@+id/my_parent_layout"
    >
    </LinearLayout>



</LinearLayout>

我正在尝试使用此类调用my_parent_layout中的另一个活动 包com.appnetics;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;

public class FragmenttestActivity extends FragmentActivity {
    Button LogIn = null ;
    final   FragmentManager fragmentManager =    getSupportFragmentManager()  ;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LogIn = (Button) findViewById(R.id.btn_showdetails); 
        LogInEvent() ; 
    }
public void LogInEvent(){

        LogIn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {


                        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                        details fragment = new details();
                        fragmentTransaction.add(R.id.my_parent_layout, fragment);
                        fragmentTransaction.commit();


            }
        }); 

    }


}

细节布局是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

   <TextView
        android:id="@+id/date_time_label"
        android:layout_centerVertical="true"
        android:layout_marginLeft="200dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:textSize="32dp"
        android:textStyle="bold"

        android:text="time_label"
        />

    <TextView
        android:id="@+id/last_view_time"
        android:layout_toRightOf="@+id/date_time_label"
        android:layout_alignBaseline="@+id/date_time_label"
        android:layout_marginLeft="8dip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="32dp"

        />

</LinearLayout>

,布局代码是 / * $ Id:$  * /

package com.appnetics;

import java.text.SimpleDateFormat;
import java.util.Date;



import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;




/**
 * DateTime
 */
public class details extends Fragment {
    private static String getDateTimeString(Date time) {
        return new SimpleDateFormat("d MMM yyyy HH:mm:ss")
            .format(time);
    }

    private final String time = getDateTimeString(new Date());

    /** @see android.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) */
    @Override
    public View onCreateView(
        LayoutInflater inflater,
        ViewGroup container,
        Bundle b)
    {
        View view = inflater.inflate(
            R.layout.details,
            container,
            false);  //!!! this is important

        ((TextView) view.findViewById(R.id.last_view_time))
            .setText(time);

        return view;
    }
}

问题是当点击按钮时,没有任何内容出现,我的代码中有什么问题

3 个答案:

答案 0 :(得分:6)

让我们开始吧!

关于您的详细信息XML:

android:layout_toRightOf="@+id/date_time_label"
android:layout_alignBaseline="@+id/date_time_label"

这两个标签用于相对布局,布局的父级必须是相对类型才能工作。

android:layout_centerVertical="true"

此标记也不正确,如果要将文本居中于textview中,可以使用两种方法或在textView中包装内容并在其父级中设置中心或使用:

android:gravity="right"
android:width="fill_parent"

这将是detail_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
    android:id="@+id/date_time_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:textSize="32dp"
    android:textStyle="bold"
    android:text="time_label"
    />

<TextView
    android:id="@+id/last_view_time"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:text="view time"
    android:textSize="32dp" />

</LinearLayout>

在main.xml上,您多次声明架构!应该在你的根布局上声明一次。

 LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

所以main.xml将是......

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

<Button
    android:id="@+id/add_fragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

<LinearLayout
    android:id="@+id/fragment_holder"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

</LinearLayout>

</LinearLayout>

片段是在其类中声明的元素并应用其xml。

public class DetailsFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment, container, false);
}
}

在主要活动中将其添加到持有人布局:

public class FragmentSimpleTestActivity extends FragmentActivity {

private Button addFragment;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);   

    final FragmentManager fragmentManager = getSupportFragmentManager();

    addFragment = (Button) findViewById(R.id.add_fragment);

    addFragment.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {   
            FragmentTransaction fragmentTransaction =      fragmentManager.beginTransaction();
            DetailsFragment fragment = new DetailsFragment();
            fragmentTransaction.add(R.id.fragment_holder,fragment, "MY_FRAG");
            fragmentTransaction.commit();
        }
    });
}
}

fragmentTransaction.add具有参数

非常重要

1:保存片段的视图的id。 2:片段对象。 3:用于查找堆栈中的片段的标记。

那就是全部:)

享受你的碎片!您还可以在添加或删除动画时设置动画。

答案 1 :(得分:0)

onCreateView()

  

当片段第一次绘制其用户界面时,系统会调用此方法。要为您的片段绘制UI,您   必须从此方法返回一个View,它是您的根   片段的布局。如果片段没有,则可以返回null   提供用户界面。

在片段类中调用OnCreateView

 return inflater.inflate(R.layout.fragmentlayout, container, false);

答案 2 :(得分:0)

当片段没有显示时,我遇到了类似的问题。问题是我删除了AndroidAnnotations,但忘记将代码从onViewCreated和onCreate方法移动到onCreateView。我通过比较两个片段的代码找到了这个错误 - 一个是显示的,另一个是不显示的。因此,如果您遇到类似问题,请尝试检查片段代码。乍一看它可能不会显示任何错误,但由于这些错误,它们仍然无法正常工作或显示。

特别是,检查您是否拥有此方法,并且您要对视图进行充气:

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

    View v = inflater.inflate(R.layout.your_fragment_layout, container, false);
    return v;

}