Android片段在布局中复制对象

时间:2011-10-21 17:20:15

标签: android android-fragments android-actionbar

我正在尝试使用新的片段和操作栏构建Android 4.0应用程序。 我做得很好,但现在我有一点问题。

当我在片组中放置一个片段,例如片段布局中的时间选择器时,在模拟器中它会出现两次,一个在另一个上面。

这是我的代码:

public class NetworksActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.networks);

    // setup Action Bar for tabs
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // instantiate fragment for the tab
    Fragment networksFragment = new NetworksFragment();
    // add a new tab and set its title text and tab listener
    actionBar.addTab(actionBar.newTab().setText("Sensors")
            .setTabListener(new ActionTabListener(networksFragment)));
}}

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

    <fragment
        android:id="@+id/net_frag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:name="my.package.test.NetworksFragment" />

</FrameLayout>

public class NetworksFragment extends Fragment {

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

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

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

    <TimePicker
        android:id="@+id/timePicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

public class ActionTabListener implements ActionBar.TabListener {

    private NetworksFragment frag;

    // Called to create an instance of the listener when adding a new tab
    public ActionTabListener(NetworksFragment fragment) {
        frag = fragment;
    }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {    
        ft.add(R.id.net_frag, frag, null);      
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(frag);        
    }
}

似乎它将两个片段(两个副本)放在同一个活动中。 你知道造成这种情况的原因吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

看起来你正在用XML定义一个片段,它将在该布局膨胀时实例化它(来自NetworksActivity.setContentView(R.layout.networks))然后你正在它下面创建它的另一个实例。

除非我遗漏了什么,否则这就是你的问题。如果您要手动实例化它并在代码中自己添加它,则无需在XML中定义它。

答案 1 :(得分:0)

我有一个类似的问题。我解决它的方法是从 Fragment-class 中删除此代码:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

CameraFragment cameraFragment = new CameraFragment();
fragmentTransaction.add(R.id.spinnerFragment, spinnerFragment);

fragmentTransaction.commit();

这段代码来自我的片段 - XML:

 <fragment
        android:id="@+id/spinnerFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        class="com.example.SpinnerFragment" />

我猜你也可以用对开的方式做到:)