2017-02-21 6 views
0

私のアンドロイドゲームでは、3つのアクティビティ:MainActivity,OptionActivityGameActivityがあります。 board_view.xmlの要素を別のアクティビティ、つまりOptionActivity.javaに引き込もうとしています。別のアクティビティで別のレイアウト要素を使用できない - アンドロイドスタジオ

Button tiles[][]; 

    public Button[][] getTiles() { 
     tiles[0][0] = (Button) findViewById(R.id.cell00); 
     tiles[0][1] = (Button) findViewById(R.id.cell01); 
     tiles[0][2] = (Button) findViewById(R.id.cell02); 
     tiles[1][0] = (Button) findViewById(R.id.cell10); 
     tiles[1][1] = (Button) findViewById(R.id.cell11); 
     tiles[1][2] = (Button) findViewById(R.id.cell12); 
     tiles[2][0] = (Button) findViewById(R.id.cell20); 
     tiles[2][1] = (Button) findViewById(R.id.cell21); 
     tiles[2][2] = (Button) findViewById(R.id.cell22); 
     return tiles; 
    } 

そして、下記のように私は、スピナークリックイベントでこれらのタイルを使用しています:
board_view.xml

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

    <Button 
     android:id="@+id/cell11" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_marginTop="180dp" /> 

    <Button 
     android:id="@+id/cell10" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/cell11" 
     android:layout_alignBottom="@+id/cell11" 
     android:layout_toLeftOf="@+id/cell11" /> 

    <Button 
     android:id="@+id/cell12" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/cell11" 
     android:layout_alignBottom="@+id/cell11" 
     android:layout_toRightOf="@+id/cell11" /> 

    <Button 
     android:id="@+id/cell01" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/cell12" 
     android:layout_alignLeft="@+id/cell11" /> 

    <Button 
     android:id="@+id/cell21" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/cell11" 
     android:layout_below="@+id/cell11" /> 

    <Button 
     android:id="@+id/cell00" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/cell01" 
     android:layout_alignBottom="@+id/cell01" 
     android:layout_alignLeft="@+id/cell10" /> 

    <Button 
     android:id="@+id/cell02" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/cell01" 
     android:layout_alignLeft="@+id/cell12" /> 

    <Button 
     android:id="@+id/cell20" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/cell21" 
     android:layout_alignBottom="@+id/cell21" 
     android:layout_alignRight="@+id/cell10" /> 

    <Button 
     android:id="@+id/cell22" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/cell21" 
     android:layout_alignBottom="@+id/cell21" 
     android:layout_alignLeft="@+id/cell12" /> 

</RelativeLayout> 

私はOptionActivity.javaboard_view.xmlから要素を引くためにこのコードを使用してい

private void spinnerListener() { 
     spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       String s = parent.getItemAtPosition(position).toString(); 
       if (s.equalsIgnoreCase("easy")) { 
        tiles[0][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 0); 
         } 
        }); 

        tiles[0][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 1); 
         } 
        }); 

        tiles[0][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 2); 
         } 
        }); 

        tiles[1][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 0); 
         } 
        }); 

        tiles[1][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 1); 
         } 
        }); 

        tiles[1][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 2); 
         } 
        }); 

        tiles[2][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 0); 
         } 
        }); 

        tiles[2][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 1); 
         } 
        }); 

        tiles[2][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 2); 
         } 
        }); 
       } else if (s.equalsIgnoreCase("intermediate")) { 
        tiles[0][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 1); 
         } 
        }); 

        tiles[0][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 0); 
         } 
        }); 

        tiles[0][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 2); 
         } 
        }); 

        tiles[1][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 1); 
         } 
        }); 

        tiles[1][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 0); 
         } 
        }); 

        tiles[1][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 2); 
         } 
        }); 

        tiles[2][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 1); 
         } 
        }); 

        tiles[2][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 0); 
         } 
        }); 

        tiles[2][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 2); 
         } 
        }); 
       } else if (s.equalsIgnoreCase("difficult")) { 
        Toast.makeText(OptionActivity.this, "Difficult", Toast.LENGTH_SHORT).show(); 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       Toast.makeText(OptionActivity.this, "Please select the difficulty level!", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

しかし、携帯電話にOptionActivityが搭載されている場合、このエラーが発生します:

02-22 00:47:13.369 8383-8383/com.example.ajaykulkarni.tictactoe E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.example.ajaykulkarni.tictactoe, PID: 8383 
                        java.lang.NullPointerException: Attempt to read from null array 
                         at com.example.ajaykulkarni.tictactoe.OptionActivity$1.onItemSelected(OptionActivity.java:106) 
                         at android.widget.AdapterView.fireOnSelected(AdapterView.java:931) 
                         at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:920) 
                         at android.widget.AdapterView.access$300(AdapterView.java:55) 
                         at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:890) 
                         at android.os.Handler.handleCallback(Handler.java:743) 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                         at android.os.Looper.loop(Looper.java:150) 
                         at android.app.ActivityThread.main(ActivityThread.java:5621) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 

ボタンの配列を別のレイアウトから別のアクティビティにプルするにはどうすればよいですか?
EDIT:
OptionActivity:

public class OptionActivity extends Activity implements Observer { 

    Model model; 
    Button start_game; 
    Button one_player; 
    RadioGroup group; 
    RadioButton player1_turn; 
    RadioButton player2_turn; 
    EditText player1_name; 
    EditText player2_name; 
    Spinner spinner1; 
    Button tiles[][]; 

    public Button[][] getTiles() { 
     tiles[0][0] = (Button) findViewById(R.id.cell00); 
     tiles[0][1] = (Button) findViewById(R.id.cell01); 
     tiles[0][2] = (Button) findViewById(R.id.cell02); 
     tiles[1][0] = (Button) findViewById(R.id.cell10); 
     tiles[1][1] = (Button) findViewById(R.id.cell11); 
     tiles[1][2] = (Button) findViewById(R.id.cell12); 
     tiles[2][0] = (Button) findViewById(R.id.cell20); 
     tiles[2][1] = (Button) findViewById(R.id.cell21); 
     tiles[2][2] = (Button) findViewById(R.id.cell22); 
     return tiles; 
    } 

    public Model getModel() { 
     return model; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     /*setContentView(R.layout.activity_option);*/ 
     setContentView(R.layout.activity_option); 
     setTitle("Tic-Tac-Toe"); 
     Log.d("Tic-Tac-Toe", "Game Option constructor"); 

     // setup the model 
     model = new Model(); 
     model.addObserver(this); 

     // setup the radio buttons and radio group 
     group = (RadioGroup) findViewById(R.id.select_turn); 

     player1_turn = (RadioButton) findViewById(R.id.player1_turn); 
     player2_turn = (RadioButton) findViewById(R.id.player2_turn); 

     // setup the edit texts 
     player1_name = (EditText) findViewById(R.id.player1_name); 
     player2_name = (EditText) findViewById(R.id.player2_name); 

     // setup the game mode buttons 
     one_player = (Button) findViewById(R.id.one_player); 

     // register the controller 
     this.registerController(); 

     /*spinner functionalities*/ 
     this.addSpinner(); 
     this.spinnerListener(); 

    } 

    private void addSpinner() { 
     spinner1 = (Spinner) findViewById(R.id.spinner1); 
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, R.id.spinner1); 
     arrayAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item); 
    } 

    private void spinnerListener() { 
     spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       String s = parent.getItemAtPosition(position).toString(); 
       if (s.equalsIgnoreCase("easy")) { 
        tiles[0][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 0); 
         } 
        }); 

        tiles[0][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 1); 
         } 
        }); 

        tiles[0][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 2); 
         } 
        }); 

        tiles[1][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 0); 
         } 
        }); 

        tiles[1][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 1); 
         } 
        }); 

        tiles[1][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 2); 
         } 
        }); 

        tiles[2][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 0); 
         } 
        }); 

        tiles[2][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 1); 
         } 
        }); 

        tiles[2][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 2); 
         } 
        }); 
       } else if (s.equalsIgnoreCase("intermediate")) { 
        tiles[0][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 1); 
         } 
        }); 

        tiles[0][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 0); 
         } 
        }); 

        tiles[0][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(0, 2); 
         } 
        }); 

        tiles[1][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 1); 
         } 
        }); 

        tiles[1][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 0); 
         } 
        }); 

        tiles[1][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(1, 2); 
         } 
        }); 

        tiles[2][0].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 1); 
         } 
        }); 

        tiles[2][1].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 0); 
         } 
        }); 

        tiles[2][2].setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          model.playerMove(2, 2); 
         } 
        }); 
       } else if (s.equalsIgnoreCase("difficult")) { 
        Toast.makeText(OptionActivity.this, "Difficult", Toast.LENGTH_SHORT).show(); 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       Toast.makeText(OptionActivity.this, "Please select the difficulty level!", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

BoardView.java:

public class BoardView extends RelativeLayout implements Observer { 

    Model model; 
    Button tiles[][]; 

    public BoardView(Context context, Model m) { 
     super(context); 

     Log.d("Tic-Tac-Toe", "BoardView constructor"); 
     View.inflate(context, R.layout.board_view, this); 

     // save the model reference 
     model = m; 
     // add this view to model's list of observers 
     model.addObserver(this); 

     // get a reference to widgets to manipulate on update 
     tiles = new Button[3][3]; 

     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       String row = Integer.toString(i); 
       String col = Integer.toString(j); 
       String tileId = "cell" + row + col; 
       int id = getResources().getIdentifier(tileId, "id", 
         getContext().getPackageName()); 
       tiles[i][j] = (Button) findViewById(id); 
       tiles[i][j].setFocusable(false); 
       tiles[i][j].getBackground().setColorFilter(Color.WHITE, 
         PorterDuff.Mode.MULTIPLY); 
      } 
     } 

     this.registerControllers(); 
    } 

    /* the controller part */ 
    private void registerControllers() { 
     tiles[0][0].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(0, 0); 
      } 
     }); 

     tiles[0][1].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(0, 1); 
      } 
     }); 

     tiles[0][2].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(0, 2); 
      } 
     }); 

     tiles[1][0].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(1, 0); 
      } 
     }); 

     tiles[1][1].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(1, 1); 
      } 
     }); 

     tiles[1][2].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(1, 2); 
      } 
     }); 

     tiles[2][0].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(2, 0); 
      } 
     }); 

     tiles[2][1].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(2, 1); 
      } 
     }); 

     tiles[2][2].setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       model.playerMove(2, 2); 
      } 
     }); 
    } 

ラインOptionActivity.java:106は次のとおりです。

tiles[0][0].setOnClickListener(new OnClickListener() { 
+0

完全な例を示してください。両方のアクティビティクラス。これはすべてのコードを投稿するという意味ではありません。あなたはあなたの質問に関連するコードを表示するだけです。特に、クラスごとに基本的な 'onCreate()'メソッドを示し、各アクティビティがどのように開始されるかを示します。 –

+0

また、エラーメッセージには 'OptionActivity.java:106'があることに注意してください。これは、OptionActivity.javaの106行目でエラーが発生したことを意味します。これがどのラインであるか教えてください。 –

+3

あるアクティビティのビューに別のアクティビティのビューにアクセスすることはできません。彼らは他の活動には存在しません。あなたができることは、同じビューをインクルード、フラグメント、またはカスタムビューのいずれかを介してレイアウトに含めることです。しかし、前回の活動と同じではありません。 –

答えて

1

エラー私の当面の問題と原因ssageはあなたがOptionActivityであなたの配列を初期化しないことです:あなたはあなたの質問では、「他の活動」を言及していても

Button tiles[][]; 

、あなたがカスタムビューBoardViewと単一のアクティビティOptionActivityを持っていることが表示されます。 Activityは、BoardViewを1つの完全なエンティティとして扱い、個々のサブビューを含む内部コンポーネントに直接アクセスしないでください。代わりに、BoardViewは、適切に制御された対話を可能にする方法を提供する必要があります。これを正しく行うと、アクティビティにはfindViewById()コールが1つしかないので、レイアウトからBoardViewを取得できます。コメント

OptionActivity

要約はBoardViewないその内部の仕組みを知っておくべきではありません。その代わりに、設定を保存して保存する責任しか負いません。ほとんどの場合、これにはSharedPreferencesを使用する必要があります。 PreferenceActivityを使用すると、大いに役立ちます。

MainActivityは、SharedPreferencesのオプションを読み込み、BoardViewに渡します。前述の「適切なメソッド」は、1つ以上のセッターメソッドです。私の提案で、BoardViewは、オプションのではなく、これらの値はどこから来たことで値に影響され、

BoardView contains the code for game operations and is influenced by the options that is selected in OptionActivity .

注意。これは多くの柔軟性を提供します。また、OptionActivityは、少なくとも直接的にはBoardViewの影響を受けません。

多くのオプションがある場合は、関連するものを1つ以上のクラスにグループ化することを検討する必要があります。

+0

さて、サブビューとやり取りするための適切な方法の例を教えていただけますか? –

+0

@AjayKulkarni「BoardView」からどのような情報が必要ですか? 'BoardView'に実行するためにアクティビティーはどのようなアクションを必要としますか?代わりに 'BoardView'でそれらをやるべきときに' OptionActivity'でこれらのことをしている可能性が高いです。 –

+0

私はアイデアを得ました。おそらく、 'activity_option.xml'のカスタムスピナーを' board_view.xml'に移動し、 'BoardView.java'でスピナー要素のクリック操作を定義すると、これらの問題を回避できます。 –

関連する問題