0

シンプルなボタンを使用してタブ機能を実現しようとしています


今起こっていること::

  • クリックButton1---->F1アクティビティが表示されます
  • (もう一度)をクリックしbutton1ます---->F2アクティビティが表示されます
  • クリックButton1(3 回目) ----->F1アクティビティが再度表示されます

- G1 & G2 アクティビティに関する Button2 と同様


FragmentDemo.java

public class FragmentDemo extends FragmentActivity implements OnClickListener {

    Button b1, b2;

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

        b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(this);

        b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.fragment_demo, menu);
        return true;
    }

    private boolean state = false;

       @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button1:
                state = !state;
                if (state) {
                addFragment(new F2(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                } else {
                addFragment(new F1(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                }
                break;

            case R.id.button2:
                state = !state;
                if (state) {
                addFragment(new G2(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                } else {
                addFragment(new G1(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                }
                break;    

            default:
                break;
            }

        }

    void addFragment(Fragment fragment, boolean addToBackStack, int transition) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.simple_fragment, fragment);
        ft.setTransition(transition);
        if (addToBackStack)
            ft.addToBackStack(null);
        ft.commit();
    }

}

F1.java

public class F1 extends Fragment {

    Context c;
    View v;

    public F1(FragmentDemo fragmentDemo) {
        // TODO Auto-generated constructor stub
        this.c = fragmentDemo;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        v = inflater.inflate(R.layout.f1, container, false);

        return v;
    }

}

F2.java

public class F2 extends Fragment {
    Context c;
    View v;

    public F2(FragmentDemo fragmentDemo) {
        // TODO Auto-generated constructor stub
        this.c = fragmentDemo;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        v = inflater.inflate(R.layout.f2, container, false);

        return v;
    }
}

G1 & G2 も同様

activity_fragment_demo.xml

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".FragmentDemo" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Button1" />

            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Button2" />

        </LinearLayout>

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

</LinearLayout>

出力::

ここに画像の説明を入力


明らかに、プロジェクトを開始すると空白の画面が表示されます.....デフォルトのアクティビティは表示されません。タブで行うように

How can i make sure a default activity say F1 be already be present when i load the project

このように::

ここに画像の説明を入力

コードにどの ような変更を加える必要があるか

私がはっきりしていることを願っています

4

2 に答える 2

0

user1950599彼が与えたコメントの提案で.....私はこれを達成しました

必要な更新は 1 行だけでした


これを共有すると誰かの助けになるかもしれません

public class FragmentDemo extends FragmentActivity implements OnClickListener {

    Button b1, b2;

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

        b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(this);

        b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener(this);


        addFragment(new F1(this), false,
                FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.fragment_demo, menu);
        return true;
    }

    private boolean state = false;

       @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button1:
                state = !state;
                if (state) {
                addFragment(new F2(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                } else {
                addFragment(new F1(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                }
                break;

            case R.id.button2:
                state = !state;
                if (state) {
                addFragment(new G2(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                } else {
                addFragment(new G1(this), false,
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                }
                break;    

            default:
                break;
            }

        }

    void addFragment(Fragment fragment, boolean addToBackStack, int transition) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.simple_fragment, fragment);
        ft.setTransition(transition);
        if (addToBackStack)
            ft.addToBackStack(null);
        ft.commit();
    }

}
于 2013-10-15T05:29:24.903 に答える
0

あなたのレイアウト activity_fragment_demo は良さそうなので、それを使用します。ID が simple_fragment の LinearLayout は、フラグメントのビューを保持するコンテナーになります。

フラグメント F1 が最初のタブを表し、フラグメント F2 が 2 番目のタブを表すとします。

したがって、あなたが持つべき3つの方法は次のとおりです。

次のメソッドは、各フラグメントをアクティビティに追加し、アクティビティの onCreate で F1 と F2 の両方に対して呼び出す必要があります。

public void addFragment(Fragment fragment)
{
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.simple_fragment, fragment);
}

次のメソッドは基本的にフラグメントを示しています。アタッチの背後の仕組みについてはわかりませんが、View.VISIBLE として見ることができます

public void attachFragment(Fragment fragment)
{
    FragmentTransaction ft = getSupportManager().beginTransaction();
    ft.attach(fragment).commit();
}

次のメソッドは、基本的にフラグメントを非表示にします。デタッチの背後にある仕組みについてはわかりませんが、View.GONE として見ることができます

public void attachFragment(Fragment fragment)
{
    FragmentTransaction ft = getSupportManager().beginTransaction();
    ft.detach(fragment).commit();
}

アクティビティの onCreate メソッド

public void onCreate()
{
    //Create all your fragments here eg F1 f1 = new F1(); etc

    //For whatever fragment you have created you should call the method addFragment

    //Now depending on what fragment you want shown by default you should call attachFragment or detachFragment. eg. if F1 has to be shown by default
    attachFragment(F1);
    detachFragment(F2) //and all otherfragment you want hidden by default

    //Set the listeners for the buttons

    //The purpose of the next two lines is to store the current state of the buttons. Since F1 is attached to button1 and it is currently being shown we set the tag to "clicked"
    //and button2 tag has been set to notClicked
    button1.setTag("clicked");
    button2.setTag("notClicked");
}

ボタンの onClickListener 内

OnClickListener onTabButtonClickListener = new OnClickListener()
{
    public void onClick(View view)
    {
        switch(view.getId)
        {
            case R.id.button1
            {
                if(button1.getTag().equals("clicked"))
                {
                    detachFragment(F2);
                    attachFragment(F1);

                    button1.setTag("notClicked");
                    button2.setTag("clicked");
                }
                else
                {
                    detachFragment(F2);
                    attachFragment(F1);

                    button1.setTag("clicked");
                    button2.setTag("notClicked");
                }
            }
            case R.id.button2
            {
                //Same thing as before except opposite
            }
        }
    }
}

私は物事を説明するのがあまり得意ではないので、質問があれば遠慮なく聞いてください。

于 2013-10-15T05:48:53.223 に答える