2011-10-21 4 views
2

新しいフラグメントとアクションバーを使用してAndroid 4.0 Appを構築しようとしています。 私はうまくやっていますが、今は少し問題があります。Android Fragmentレイアウト内の重複オブジェクト

フラグメントをフラグメントレイアウト内のタブの中に入れたり、タイムピッカーを置いたりすると、エミュレータではもう一方が上に重ねて表示されます。ここで

は私のコードです:

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つのコピー)を同じアクティビティに入れているようです。 これは何が原因であるか知っていますか?

ありがとうございます。

答えて

2

XML(NetworkActivity.setContentView(R.layout.networks)から)が膨張したときにインスタンスを生成するフラグメントをXMLで定義しているようです。その直下に別のインスタンスを作成しています。

私が何かを紛失していない限り、それはあなたの問題です。 XMLで定義する必要はありません。手動でインスタンス化し、コードで追加する必要があります。

+0

これは正しいです。タブリスナーでフラグメントを追加する場合は、xmlレイアウトに追加する必要はありません。それはレイアウトで一度追加され、TabListenerに追加すると再び表示されます – Dave

0

私はと同様の問題を持っていました。私はあなたを推測

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

:私のフラグメント-XMLからこのコードを左

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

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

fragmentTransaction.commit(); 

そして:私はそれを解く方法はは私のフラグメント-クラスからこのコードを削除しましたそれはまた、偶然の方法で行うことができます:)

関連する問題