findViewById с обратным поиском не работает - PullRequest
0 голосов
/ 25 ноября 2018

Я сейчас в замешательстве.Я ожидаю, что то, что работает в одну сторону, также работает в обратном порядке.Но, видимо, нет ... Я создаю представление программно в моем классе PlayerView.В методе player_table я назначаю слушателя onclick.И это прекрасно работает.Однако в классе PlayerLifePoints_Functions я создал метод onclick.Сам метод работает отлично.Проблема заключается в следующем: я назначаю идентификаторы вручную (чтобы облегчить мою работу на следующих этапах процесса).Теперь я могу прочитать идентификатор элемента, по которому щелкнули.Однако, если я хочу найти именно этот элемент по идентификатору (например, 400), он возвращает ошибку:

Ошибка: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.view.Window$ Callback android.view.Window.getCallback () 'для пустой ссылки на объект в ... PlayerLifePoints_Functions.onClick (PlayerLifePoints_Functions.java:21) -> Строка с командой журнала

У меня естьпонятия не имею почему.Я также пытался использовать getParent (), но это тоже не работает.Любые идеи, где проблема может быть?

Class PlayerView

public class PlayerView extends View {

    private RelativeLayout relativeLayout;
    private TableLayout tableLayout;
    private int player_loop;
    private int player_count;

    public PlayerView(Context context, int player_count){
        super(context);
        setPlayer_count(player_count);
    }

    public ScrollView create_scrollView(){

        ScrollView scrollView = new ScrollView(getContext());
        ScrollView.LayoutParams scroll_params = new ScrollView.LayoutParams(
                ScrollView.LayoutParams.MATCH_PARENT,
                ScrollView.LayoutParams.MATCH_PARENT
        );
        scrollView.setLayoutParams(scroll_params);
        scrollView.addView(create_relativeLayout());

        return scrollView;
    }

    public HorizontalScrollView create_relativeLayout(){

        HorizontalScrollView horizontalScrollView = new HorizontalScrollView(getContext());

        relativeLayout = new RelativeLayout(getContext());
        RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT
        );
        relativeLayout.setLayoutParams(relativeParams);
        create_Player_Table_Layout();

        horizontalScrollView.addView(relativeLayout);
        return horizontalScrollView;

    }

    public void create_Player_Table_Layout(){

        for(player_loop = 1; player_loop <= player_count; player_loop++){

            relativeLayout.addView(player_table(getResources().getString(R.string.dummy_player_name) + player_loop, player_loop));

        }
    }

    public TableLayout player_table(String playername, int playernumber){

        tableLayout = new TableLayout(getContext());
        tableLayout.setId(playernumber * 1000);

        if (playernumber > 1) {

            //TABLE PLACEMENT
            RelativeLayout.LayoutParams tbl_params_New = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            tbl_params_New.addRule(RelativeLayout.RIGHT_OF, (playernumber - 1) * 1000);
            tableLayout.setLayoutParams(tbl_params_New);
        }

        //Add Playername
        TableRow row_playername = new TableRow(getContext());
        TextView view_name = new TextView(getContext());

        TableRow.LayoutParams view_name_params = new TableRow.LayoutParams();
        view_name_params.setMargins(20,20,20,20);

        view_name.setLayoutParams(view_name_params);
        view_name.setGravity(Gravity.CENTER);
        view_name.setText(playername);
        view_name.setTextSize(20);
        view_name.setId(playernumber * 100);

        //OnClickListener
        PlayerName_Functions listener_name = new PlayerName_Functions();
        view_name.setOnClickListener(listener_name);

        row_playername.addView(view_name);
        tableLayout.addView(row_playername);

        //Add Lifepoints
        TableRow row_lifepoints = new TableRow(getContext());
        TextView view_lifepoints = new TextView(getContext());

        TableRow.LayoutParams view_lifepoints_params = new TableRow.LayoutParams();
        view_lifepoints_params.setMargins(20, 0, 20, 20);

        view_lifepoints.setText("40");
        view_lifepoints.setTextSize(40);
        view_lifepoints.setGravity(Gravity.CENTER);
        view_lifepoints.setId(playernumber * 100 + 10);
        view_lifepoints.setLayoutParams(view_lifepoints_params);

        //OnClickListener
        PlayerLifePoints_Functions listener_lifepoints = new PlayerLifePoints_Functions();
        view_lifepoints.setOnClickListener(listener_lifepoints);

        row_lifepoints.addView(view_lifepoints);
        tableLayout.addView(row_lifepoints);

        for(int opponent_loop = 1; opponent_loop <= player_count; opponent_loop++){
            tableLayout.addView(commander_damage_from_player(player_loop, opponent_loop));
        }

        return tableLayout;
    }

Class PlayerLifePoints (Содержит функцию OnClick, реализованную в классе выше)

public class PlayerLifePoints_Functions extends AppCompatActivity implements View.OnClickListener {

    @Override
    public void onClick(View v) {

        TextView textView = (TextView) v;

        String lp = textView.getText().toString();
        int id = textView.getId();
        int playernumber =  Character.getNumericValue(String.valueOf(id).charAt(0));

        Log.d("Test", "ID: " + findViewById(v.getId()).getId());

//        Intent intent = new Intent(v.getContext(), Update_LifePoints.class);
//        intent.putExtra( "Update Reason", "Test");
////        intent.putExtra("Player Name", playername);
//        intent.putExtra("Lifepoints", lp);
//
//        v.getContext().startActivity(intent);


    }

1 Ответ

0 голосов
/ 25 ноября 2018

Ваш класс PlayerLifePoints_Functions не может использовать findViewById, потому что у него нет контента.Обычно действия начинаются с Intents , и они раздувают макет, переопределяя метод onCreate .

Если вы хотите просто заставить его работать, вы можете использовать:

v.getRootView().findViewById(v.getId()).getId());

В этом случае вам не нужно расширяться от AppCompatActivity

Или лучше просто избавиться от класса:

view_lifepoints.setOnClickListener( View.OnClickListener {

  @Override
  public void onClick(View v) {

      TextView textView = (TextView) v;

      String lp = textView.getText().toString();
      int id = textView.getId();
      int playernumber =  Character.getNumericValue(String.valueOf(id).charAt(0));

      Log.d("Test", "ID: " + findViewById(v.getId()).getId());
  }

);

В общем:Я бы порекомендовал не помещать всю вашу логику в поле зрения, а больше на нижний уровень.Наличие этого в действии уже было бы улучшением для прототипирования.Если ваш код расширяется, возможно, имеет смысл переключиться на MVP или MVVM .

У Google есть отличные ресурсы для начала работы: https://developer.android.com/guide/components/activities/intro-activitieshttps://developer.android.com/topic/libraries/architecture/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...