Фрагмент Android дубликата объектов в макете - PullRequest
2 голосов
/ 21 октября 2011

Я пытаюсь создать приложение для 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 ]

2 голосов
/ 02 ноября 2011

Похоже, что вы определяете фрагмент в XML, который будет создавать его экземпляр, когда этот макет раздувается (из NetworksActivity.setContentView (R.layout.networks)), а затем вы создаете другой его экземпляр чуть ниже этого.

Если я что-то упустил, это ваша проблема. Нет необходимости определять его в XML, если вы собираетесь создать его экземпляр вручную и добавить его самостоятельно в код.

0 голосов
/ 20 мая 2014

У меня была похожая проблема .То, как я решил это , заключалось в том, чтобы удалить этот код из моего класса фрагмента :

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" />

Полагаю, вы можете сделать это и другим способом:)

...