Взятие поля edittext и отображение в TextView

Я относительно новичок в программировании, но имею некоторый опыт работы с Java и Android. У меня действительно основная проблема, которую я делал снова и снова, но по какой-то причине это не работает!

У меня есть поле edittext, которое заполняется пользователем. Когда кнопка ввода нажата, приложение берет это и сохраняет как строку. Затем строка используется для заполнения TextView пользовательским вводом.

Я создал findviewbyids, я установил строку, равную вводу edittext, а затем установил текст в текстовом представлении как строку в соответствии с приведенным ниже кодом. Я проверил предыдущие приложения, которые я сделал, и это всегда работало раньше...

package com.example.android.golfhandicap;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

EditText playerName;
TextView playerOneName;
String name;
int handicap;
EditText playerHandicap;
TextView playerOneHcp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.front_page);

}
//set view by IDs
public void views() {
    playerName = findViewById(R.id.inputPlayerName);
    playerOneName = findViewById(R.id.playerOneName);
    playerHandicap = findViewById(R.id.inputPlayerHcp);
    playerOneHcp = findViewById(R.id.playerOneHcp);

}

/**
 * Add the codes for the button to navigate around the app
 */


public void enterScore1(View view) {
setContentView(R.layout.front_page);
}

public void addPlayer(View view) {
    setContentView(R.layout.new_player);
}

public void addScore(View view) {
    setContentView(R.layout.input_page);
}


public void enterPlayer(View view) {

    views();


    name = playerName.getText().toString();
//handicap = Integer.parseInt(playerHandicap.getText().toString());



playerOneName.setText(name);
//playerOneHcp.setText(handicap);



    Toast.makeText(this, "player name is " + name + " and handicap is 
" + handicap , Toast.LENGTH_SHORT).show();
    setContentView(R.layout.front_page);



}
}

XML для страницы с текстовым представлением, в котором я хочу отобразить String:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
tools:context=".MainActivity">

<TextView
    android:id="@+id/appName2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:text="Golf handicap"
    android:textAlignment="center"
    android:textColor="@color/colorPrimaryDark"
    android:textSize="24sp"
    android:textStyle="bold"
    android:visibility="visible"
    android:editable="false"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/playerOneName"
    android:layout_width="136dp"
    android:layout_height="30dp"
    android:layout_marginStart="8dp"
    android:editable="false"
    android:layout_marginTop="32dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/appName2" />

<TextView
    android:id="@+id/playerOneName2"
    android:editable="false"
    android:layout_width="136dp"
    android:layout_height="30dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="24dp"
    android:visibility="invisible"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/playerOneName3" />

<TextView
    android:id="@+id/playerOneName3"
    android:editable="false"
    android:layout_width="136dp"
    android:layout_height="30dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="24dp"
    android:visibility="invisible"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/playerOneName" />

<Button
    android:id="@+id/addScore"
    android:layout_width="200dp"
    android:layout_height="40dp"
    android:layout_marginBottom="16dp"
    android:background="@android:color/holo_green_light"
    android:onClick="addScore"
    android:text="Add new score"
    android:visibility="visible"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/addPlayer" />

<Button
    android:id="@+id/addPlayer"
    android:layout_width="200dp"
    android:layout_height="40dp"
    android:layout_marginBottom="16dp"
    android:background="@android:color/holo_green_light"
    android:onClick="addPlayer"
    android:text="Add new player"
    android:visibility="visible"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/addScore"
    app:layout_constraintStart_toStartOf="parent" />

<TextView
    android:id="@+id/playerOneHcp"
    android:layout_width="43dp"
    android:layout_height="30dp"
    android:layout_marginStart="31dp"
    android:layout_marginTop="32dp"
    android:editable="false"
    android:ems="10"
    android:inputType="number"
    android:textAlignment="center"
    android:visibility="visible"
    app:layout_constraintStart_toEndOf="@+id/playerOneName"
    app:layout_constraintTop_toBottomOf="@+id/appName2" />

<TextView
    android:id="@+id/editText2"
    android:editable="false"
    android:layout_width="43dp"
    android:layout_height="30dp"
    android:layout_marginStart="31dp"
    android:layout_marginTop="24dp"
    android:ems="10"
    android:inputType="number"
    android:textAlignment="center"
    android:visibility="invisible"
    app:layout_constraintStart_toEndOf="@+id/playerOneName2"
    app:layout_constraintTop_toBottomOf="@+id/editText3" />

<TextView
    android:id="@+id/editText3"
    android:editable="false"
    android:layout_width="43dp"
    android:layout_height="30dp"
    android:layout_marginStart="31dp"
    android:layout_marginTop="24dp"
    android:ems="10"
    android:inputType="number"
    android:textAlignment="center"
    android:visibility="invisible"
    app:layout_constraintStart_toEndOf="@+id/playerOneName3"
    app:layout_constraintTop_toBottomOf="@+id/playerOneHcp" />

</android.support.constraint.ConstraintLayout>

XML для макета с edittext, из которого я получаю пользовательский ввод:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">


<TextView
    android:id="@+id/enterHcpText"
    android:layout_width="136dp"
    android:layout_height="50dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="24dp"
    android:editable="false"
    android:text="Current handicap :"
    android:textAlignment="center"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/enterAgeText" />

<TextView
    android:id="@+id/enterAgeText"
    android:layout_width="136dp"
    android:layout_height="50dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="24dp"
    android:editable="false"
    android:text="Player age :"
    android:textAlignment="center"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/enterNameText" />

<TextView
    android:id="@+id/enterNameText"
    android:layout_width="136dp"
    android:layout_height="50dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="32dp"
    android:editable="false"
    android:text="Player name :"
    android:textAlignment="center"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/appName3" />

<TextView
    android:id="@+id/appName3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:editable="false"
    android:text="Golf handicap"
    android:textAlignment="center"
    android:textColor="@color/colorPrimaryDark"
    android:textSize="24sp"
    android:textStyle="bold"
    android:visibility="visible"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<EditText
    android:id="@+id/inputPlayerName"
    android:layout_width="130dp"
    android:layout_height="50dp"
    android:layout_marginTop="32dp"
    android:layout_marginEnd="33dp"
    android:maxLength="25"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/appName3" />

<EditText
    android:id="@+id/inputPlayerAge"
    android:layout_width="130dp"
    android:layout_height="50dp"
    android:layout_marginTop="24dp"
    android:layout_marginEnd="33dp"
    android:inputType="number"
    android:maxLength="2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/inputPlayerName" />

<EditText
    android:id="@+id/inputPlayerHcp"
    android:layout_width="130dp"
    android:layout_height="50dp"
    android:layout_marginTop="24dp"
    android:layout_marginEnd="33dp"
    android:inputType="number"
    android:maxLength="2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/inputPlayerAge" />

<Button
    android:id="@+id/enterPlayer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="148dp"
    android:layout_marginTop="96dp"
    android:layout_marginEnd="148dp"
    android:onClick="enterPlayer"
    android:text="Enter"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/inputPlayerHcp" />

</android.support.constraint.ConstraintLayout>

Если я закомментирую строку p1Name.setText(name);, то она работает нормально, у меня есть тост, чтобы проверить, что имя занято, и имя установлено в качестве ввода. Значит, что-то не так с p1Name. Я проверил и трижды проверил, все идентификаторы верны.

Я потратил более часа, пытаясь понять это, и не вижу, что я делаю неправильно!

Это строки, которые я получаю в logcat (все строки показаны красным)

2019-01-24 23:29:39.376 9545-9545/com.example.android.golfhandicap E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.golfhandicap, PID: 9545
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24770) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.android.golfhandicap.MainActivity.enterPlayer(MainActivity.java:65)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24770) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

Любая помощь будет принята с благодарностью.


person Danny Jebb    schedule 24.01.2019    source источник
comment
любая ошибка в logcat? опубликуйте тег xml для id playerOneName   -  person Kartik    schedule 25.01.2019
comment
Кажется, я получаю 2 ошибки при просмотре Logcat (никогда не использовал его раньше, поэтому не уверен, что они полезны,   -  person Danny Jebb    schedule 25.01.2019
comment
Первая ошибка — InvocationTargetException, вторая — исключение nullpointerException.   -  person Danny Jebb    schedule 25.01.2019
comment
Это xml для текстового представления playerOneName ‹TextView android:id=@+id/playerOneName android:layout_width=136dp android:layout_height=30dp android:layout_marginStart=8dp android:editable=false android:layout_marginTop=32dp android:visibility=invisible приложение: layout_constraintStart_toStartOf=родительское приложение:layout_constraintTop_toBottomOf=@+id/appName2 /›   -  person Danny Jebb    schedule 25.01.2019
comment
Я все еще новичок в студии Android, я только что запустил java-модуль в рамках своей степени. Мой logcat содержит огромное количество информации, 2 ошибки выше - это то, в чем я полагаю, проблема. Но я еще не изучал ошибки logcat.   -  person Danny Jebb    schedule 25.01.2019
comment
Пожалуйста, отредактируйте свой исходный пост и вставьте туда весь соответствующий код. Это будут: MainActivity и XML для основного действия (или соответствующие файлы действий). Трудно понять проблему без полного кода   -  person S. Czop    schedule 25.01.2019
comment
Спасибо, я отредактировал исходный вопрос. Некоторые из xml-файлов не полностью закончены, но это текстовые и текстовые представления, которые я еще не пытаюсь использовать.   -  person Danny Jebb    schedule 25.01.2019
comment
Возможный дубликат Что такое исключение NullPointerException и как его исправить?   -  person Kartik    schedule 25.01.2019


Ответы (1)


Проблема просто из-за следующего:

  1. вы не привязали представление к findViewById. Это из-за следующего кода:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.front_page);
    
        // Here you haven't bind the view.
    }
    

вы должны напрямую связать представление с вашим методом views(). Итак, измените код на этот:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.front_page);

        // bind the view.
        views();
    }
  1. Вы меняете представление макета каждый раз, когда нажимаете кнопку с помощью этого метода:

    public void addScore(View view) {
        setContentView(R.layout.input_page);
    }
    

который стал одним из источников вашей проблемы. Во-первых, это не рекомендуется, потому что вы перерисовываете весь макет при вызове setContentView. Во-вторых, вам нужно убедиться, что весь макет onClick реализован в вашем коде.

  1. И последнее, но не менее важное: вам лучше использовать атрибут setOnClickListener в коде вместо атрибута onClick в макете. Это потому, что вы должны разделять логику и пользовательский интерфейс.
person ישו אוהב אותך    schedule 25.01.2019
comment
Большое спасибо за ваш ответ. Я изменил findviewbtids на метод onCreate, но это не очень помогло. С некоторыми другими вещами, которые вы упомянули, я не знаком. Я использовал onClickListener в другом приложении, но в основном он был скопирован из онлайн-решения. надо почитать как правильно сделать - person Danny Jebb; 26.01.2019
comment
Короче говоря, вам просто нужно установить макет и привязать представление макета к коду, прежде чем кнопка onClick сможет работать. У вас проблема только потому, что вы не ознакомились с тем, как работает код Android. Просто не торопитесь, чтобы узнать немного глубже ;) - person ישו אוהב אותך; 26.01.2019