2017-02-21 17 views
0

У меня 3 действия в моей игре для Android: MainActivity, OptionActivity и GameActivity. Я пытаюсь втянуть элементы board_view.xml в другую активность, то есть в OptionActivity.java.
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> 

Я использую этот код, чтобы тянуть элементы из 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; 
    } 

И я использую эти плитки в роллерных событий щелчка, как указано ниже:

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

Просьба показать полный пример. Мы оба класса Activity. Обратите внимание, что это не означает, что вы отправляете весь свой код. Вам нужно всего лишь показать код, относящийся к вашему вопросу. В частности, покажите базовый метод 'onCreate()' для каждого класса и покажите, как запускается каждое действие. –

+0

Кроме того, обратите внимание, что сообщение об ошибке имеет параметр OptionActivity.java: 106'. Это означает, что ошибка возникает в строке 106 OptionActivity.java. Скажите, пожалуйста, какая строка. –

+3

У вас нет доступа к просмотру одной активности в другой. Они не существуют в другой деятельности. То, что вы можете сделать, это включить те же представления в макет через либо include, фрагмент, либо пользовательское представление. Но они не будут теми же взглядами, что и в предыдущем мероприятии. –

ответ

1

Непосредственная проблема и причина ошибки меня Ssage является то, что вы никогда не инициализировать массив в OptionActivity:

Button tiles[][]; 

Даже если вы уже «другой деятельности» в вашем вопросе, кажется, что у вас есть настраиваемое представление BoardView и одного вида деятельности OptionActivity. Activity должен обрабатывать BoardView как единый, полный объект и никогда не обращаться к его внутренним компонентам напрямую, включая отдельные подсмотры. Вместо этого BoardView должен предоставить соответствующие методы, позволяющие осуществлять очень контролируемое взаимодействие. Если вы сделаете это правильно, в действии будет только один вызов findViewById(), чтобы получить BoardView из макета.

Резюме комментариев

OptionActivity не должны знать о BoardView не его внутренней работы. Вместо этого он должен отвечать только за настройку предпочтений и сохранение их. Скорее всего, вы должны использовать для этого SharedPreferences. Использование PreferenceActivity поможет чрезвычайно.

Теперь ваши MainActivity загрузите опции с SharedPreferences и передайте их в BoardView. «Соответствующие методы», о которых я упоминал ранее, будут представлять собой один или несколько методов установки.

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

Обратите внимание, что, с моим предложением, BoardView находится под влиянием значений из вариантов, но не где эти значения берутся.Это обеспечивает большую гибкость. Кроме того, OptionActivity не зависит от BoardView вообще, по крайней мере, не напрямую.

Если есть много вариантов, вы должны рассмотреть группировку связанных между собой в один или несколько классов.

+0

Хорошо, можете ли вы дать мне несколько примеров соответствующих методов взаимодействия с subviews? –

+0

@AjayKulkarni Какая информация потребуется от «BoardView»? Какие действия нужно выполнять команде «BoardView»? Вероятно, вы уже делаете эти вещи в «OptionActivity», когда вы должны делать их в «BoardView». –

+0

У меня появилась идея, может быть, я могу переместить этот пользовательский счетчик в 'activity_option.xml' на' board_view.xml' и определить операции щелчка элемента spinner в 'BoardView.java', что позволило бы избежать всех этих проблем ... –

 Смежные вопросы

  • Нет связанных вопросов^_^