1

別のフラグメントからメソッドを呼び出したいのですが、TextViews の値が null であると何度も言われます..?

プレイヤー1:

public class PlayerTurn1 extends Fragment  {

    TextView p1Name;
    TextView p1Icon;
    Button doneP1;
    Button resetP1;
    EditText row;
    EditText column;
    TicTacToeLayout myObject = new TicTacToeLayout();
    ArrayList<String> player1;
    Bundle extras = new Bundle();
    int turn = 1;

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

       extras = getArguments();

       player1 = new ArrayList<String>(extras.getStringArrayList("player1"));

       Toast.makeText(getActivity(), player1.get(0), Toast.LENGTH_LONG).show();//Name of the player
       Toast.makeText(getActivity(), player1.get(1), Toast.LENGTH_LONG).show();//Icon chosen by the player

        row = (EditText) getActivity().findViewById(R.id.rowP1);
        column = (EditText) getActivity().findViewById(R.id.columnP1);
        p1Name = (TextView) getActivity().findViewById(R.id.p1NameInfo);
        p1Icon = (TextView) getActivity().findViewById(R.id.p1IconInfo);
        doneP1 = (Button) getActivity().findViewById(R.id.doneP1);
        resetP1 = (Button) getActivity().findViewById(R.id.resetP2);

        setPlayer();


        doneP1.setOnClickListener(new View.OnClickListener() {          
            public void onClick(View v) {   

                if(checkField() != false)
                {
                     int rowValueInt = Integer.parseInt(row.getText().toString());
                     int colValueInt = Integer.parseInt(column.getText().toString());

                    myObject.play(rowValueInt, colValueInt, player1.get(1));
                    callPlayer2Fragment();

                }


            }
        });
    }

プレーヤー 2 フラグメントはまったく同じコードなので、あえて追加しません。

TicTacToeLayout フラグメント クラス:

public class TicTacToeLayout extends Fragment {

    TextView image1, image2, image3, image4, image5, image6, image7, image8, image9;
    TextView[][] images;


    public View onCreateView(LayoutInflater inflater,
    ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.tictactoe_layout, container, false);
    }

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


        image1 = (TextView) getActivity().findViewById(R.id.Image1);
        image2 = (TextView) getActivity().findViewById(R.id.Image2);
        image3 = (TextView) getActivity().findViewById(R.id.Image3);
        image4 = (TextView) getActivity().findViewById(R.id.Image4);
        image5 = (TextView) getActivity().findViewById(R.id.Image5);
        image6 = (TextView) getActivity().findViewById(R.id.Image6);
        image7 = (TextView) getActivity().findViewById(R.id.Image7);
        image8 = (TextView) getActivity().findViewById(R.id.Image8);
        image9 = (TextView) getActivity().findViewById(R.id.Image9);

        images = new TextView[][]{ {image1, image2, image3},
                                   {image4, image5, image6},
                                   {image7, image8, image9} };

        toast();
    }

    public void toast()
    {
        Toast.makeText(getActivity(), images[0][0].getText().toString(), Toast.LENGTH_LONG).show();
        Toast.makeText(getActivity(), images[0][1].getText().toString(), Toast.LENGTH_LONG).show();
        Toast.makeText(getActivity(), images[0][2].getText().toString(), Toast.LENGTH_LONG).show();
        Toast.makeText(getActivity(), images[1][0].getText().toString(), Toast.LENGTH_LONG).show();
    }

    public void play(int row, int column, String icon)
    {
            images[row-1][column-1].setText(icon);
    }

}

配列に何かがあり、それが機能することを確認するためだけに、試して乾杯する方法を作成しました。ただし、フラグメントが作成されたときにのみ何かをトーストします。メソッド呼び出し myObject.play(rowValueInt, colValueInt, player1.get(1)); の後、デバッガーは私の画像のすべての値がnullであることを教えてくれます。

これはデバッガーが言うことです:

this    TicTacToeLayout  (id=830016401072)  
    image1  null    
    image2  null    
    image3  null    
    image4  null    
    image5  null    
    image6  null    
    image7  null    
    image8  null    
    image9  null    
    images  null    

row 1   
column  2   
icon    "O" (id=830016398920)   

これは基本的に、完了ボタンをクリックしたときに発生します。プレーヤーがボタンを押すと、TicTacToeLayout フラグメントで、プレーヤーが入力した行と列にあるテキストビューが X または O に変更されます。行、列、アイコンはすべてそれぞれの値を持ちますが、画像はオブジェクトの呼び出し後に null になりました。何か案は?どうやら私が多くの情報を提供しておらず、管理者が腹を立てたため、私のスレッドは閉鎖されました。他に何か必要な場合は、更新しますと言ってください.

PlayerTurn1 にある 2 番目のプレーヤー フラグメントのEDIT呼び出し

public void callPlayer2Fragment()
    {
        FragmentManager fm       = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        Fragment Player2Frag = new PlayerTurn2();
        Player2Frag.setArguments(extras);
        ft.replace(R.id.fragment_container, Player2Frag);
        ft.commit();
    }

完了ボタンをクリックすると、PlayerTurn2 フラグメントが呼び出され、このクラスから引数が渡されますが、このフラグメントは置き換えられます。

XML レイアウト

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

        <FrameLayout
         android:id="@+id/fragment_container"
         android:layout_width="0px"
         android:layout_height="match_parent" 
         android:layout_weight="1" />

        <fragment
            android:id="@+id/frag2"
            android:name="As2.packageTK.TicTacToeLayout"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1" />

    </LinearLayout>
4

1 に答える 1

0

それらがすべて null である理由は、フラグメントが現在「生きている」(つまり、アタッチまたは作成されていない) ためです。アクティビティのインターフェイスを介して行う必要があります。ここで説明します

于 2013-03-27T06:17:30.857 に答える