7

私はAndroidにかなり慣れていないので、これには明らかな答えがあるかもしれませんが、見つけられないようです.

私は電卓アプリのバージョンを書いています。ユーザーがボタンの1つをクリックすると、フラグメントが開始されるようにしたいと思います(さらに多くのボタンを使用して、より多くの入力に使用できます)。

フラグメント コードは次のとおりです。

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class VariableMenu extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);}

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

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

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

}

次のような XML レイアウトを使用します。

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

<Button
        android:id="@+id/Bx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="X" 
        android:onClick="onButtonClicked"/>
    <Button
        android:id="@+id/By"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/Bx"
        android:layout_alignTop="@id/Bx"
        android:text="Y" 
        android:onClick="onButtonClicked"/>
    <Button
        android:id="@+id/Bz"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/By"
        android:layout_alignTop="@id/By"
        android:text="Z" 
        android:onClick="onButtonClicked"/>

</RelativeLayout>

(ハードコードされた文字列を使用すべきではないことはわかっていますが、実行できるようになったら修正します)

次のように、アクティブ化ボタンの onTouch メソッドで fragmenttransaction を使用して追加してみました。

public void onFragmentActivated(View v) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        VariableMenu fragment = new VariableMenu();
        fragmentTransaction.add(R.layout.main, fragment);
        fragmentTransaction.commit();
    }

しかし、それは「フラグメントVariableMenuのid:...(main)のビューが見つかりません」というエラーが発生しました。

そこで、メインの XML ファイルでビューを作成しました。

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

(Irrelevant things)

    <fragment
        android:id="@+id/Fragment"
        android:name="calculator.app.VariableMenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/B1"/>

(Irrelevant things)

</RelativeLayout>

しかし、これにより、アクティビティが作成される (および setContentView(R.layout.main); が実行される) とすぐにフラグメントが存在することになります。

プログラムで UI を使用してフラグメントをアクティビティに追加および削除する簡単な方法はありますか?

4

2 に答える 2

11

ここでの問題は、フラグメントが存在するビュー ID を持つコンテナーを必要とすることです。レイアウト ID を指定すると、見たエラーが発生します。

フラグメントを相対的なレイアウトに追加できますが、それを適切に行うには、配置できるように適切なレイアウト パラメータを割り当てる必要があります。そのコンテンツをラップする相対レイアウト内に FrameLayout を作成し、そこにフラグメントを追加する方が簡単です。

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

    <FrameLayout
        android:id="@+id/FragmentContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/B1"/>

</RelativeLayout>

それで

fragmentTransaction.add(R.id.FragmentContainer, fragment);
于 2012-05-02T19:11:42.773 に答える