2017-09-26 4 views
0

Ich habe ein sehr einfaches Beispiel, das einem Benutzer ermöglicht, ein Element in einem Drehfeld auszuwählen und je nach ausgewähltem Element erscheint das entsprechende Bild in einer Bildansicht.ein Wort einer Textansicht auf Knopfdruck ändern

Auch ich habe eine Textansicht, die standardmäßig "Wählen Sie einen Artikel" und wenn der Artikel 1 ausgewählt ist diese Textansicht zeigt "Der Name des Artikels 1 ist keine" und wenn der Artikel 2 ausgewählt ist, wird angezeigt "Der Name des Artikels 2 ist keine ".

Und jetzt habe ich einen editext und eine Schaltfläche, und ich möchte einen Namen in der Editext eingeben und wenn ich einen Namen in der Editext (zum Beispiel John) eingeben und klicken Sie auf die Schaltfläche Ich möchte, dass der Text in der Textansicht ändert sich in "Der Name von item1 ist John". Ich versuche mit dem Code unten, aber es funktioniert nicht. Weißt du, wie man löst?

Beispiel: Wenn ich "John" schreibe und auf die Schaltfläche klicke Anstatt "Der Name von item2 ist John" erscheint "John Der Name von item2 ist keiner".

Aktivität xml:

<?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" 
    tools:context="com.example.ricardorei.tpc.MainActivity"> 

    <Button 
     android:id="@+id/button3" 
     android:layout_width="0dp" 
     android:layout_height="48dp" 
     android:text="Button" 
     app:layout_constraintTop_toTopOf="parent" 
     android:layout_marginTop="166dp" 
     android:layout_marginRight="56dp" 
     app:layout_constraintRight_toRightOf="parent" 
     android:layout_marginEnd="58dp" 
     android:onClick="addName"/> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="0dp" 
     android:layout_height="220dp" 
     android:layout_marginBottom="16dp" 
     android:layout_marginEnd="8dp" 
     android:layout_marginLeft="8dp" 
     android:layout_marginRight="8dp" 
     android:layout_marginStart="8dp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintHorizontal_bias="0.0" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" /> 

    <Spinner 
     android:id="@+id/spinner2" 
     android:layout_width="200dp" 
     android:layout_height="30dp" 
     android:layout_marginLeft="32dp" 
     android:layout_marginRight="8dp" 
     android:layout_marginStart="16dp" 
     android:layout_marginTop="32dp" 
     android:entries="@array/spinner_values" 
     app:layout_constraintHorizontal_bias="0.0" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     /> 

    <EditText 
     android:id="@+id/editText2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:inputType="textPersonName" 
     app:layout_constraintBaseline_toBaselineOf="@+id/button3" 
     tools:layout_editor_absoluteX="32dp" /> 

    <TextView 
     android:id="@+id/textView4" 
     android:layout_width="391dp" 
     android:layout_height="51dp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintHorizontal_bias="0.369" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintVertical_bias="0.48" /> 


</android.support.constraint.ConstraintLayout> 

String xml:

<resources> 
    <string name="app_name">tpc</string> 
    <string-array name="spinner_values"> 
     <item>Select</item> 
     <item>item1</item> 
     <item>item2</item> 
    </string-array> 
</resources> 

Code:

public class MainActivity extends AppCompatActivity { 

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

     Spinner spinner = (Spinner) findViewById(R.id.spinner2); 
     String string = String.valueOf(spinner.getSelectedItem()); 




     final ImageView image = (ImageView)findViewById(R.id.image); 

     final TextView txt = (TextView) findViewById(R.id.textView4); 



     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       switch (position) { 
        case 0: 
         txt.setText("Select an item"); 
         image.setImageResource(R.drawable.bg); 
         break; 
        case 1: 
         txt.setText("The name of item1 is none"); 
         image.setImageResource(R.drawable.item1); 
         break; 
        case 2: 
         txt.setText("The name of item2 is none"); 
         image.setImageResource(R.drawable.item2); 
         break; 
        default: 
         //Default image 
         //image.setImageResource(R.drawable.item2); 
         break; 

       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

    } 

    public void addName(View view) { 
     EditText editext = (EditText) findViewById(R.id.editText2); 
     TextView txt = (TextView) findViewById(R.id.textView4); 
     txt.setText(txt.getText().replace(5, 1, editext.getText())); 

    } 
+0

Was genau meinen Sie mit ** nicht funktioniert **? Was macht es, wenn Sie auf die Schaltfläche klicken? – kRiZ

+0

Wenn ich "John" schreibe und auf die Schaltfläche klicke Anstatt "Der Name von item2 is john" erscheint "john Der Name von item2 is none". – JonD

+0

Sie wirklich brauchen nur den Namen und die Position des Spinners speichern ab und ersetze ein String dieser –

Antwort

2

Ein besserer Ansatz ist Token in den Saiten zu verwenden, die der Benutzer auswählt durch den Namen ersetzt werden. Diese Vorgehensweise hat den zusätzlichen Vorteil, dass der Benutzer, selbst wenn er die Spinner-Auswahl ändert, in der Textansicht ersetzt wird.

Zuerst die Saiten zu Ihrem strings.xml, mit Token-Platzhalter hinzufügen:

<resources> 
    <string name="app_name">tpc</string> 
    <string name="item_0">Select an item</string> 
    <string name="item_1">The name of item1 is %1$s</string> 
    <string name="item_2">The name of item2 is %1$s</string> 
    <string-array name="spinner_values"> 
     <item>Select</item> 
     <item>item1</item> 
     <item>item2</item> 
    </string-array> 
</resources> 

Dann Elementvariablen erstellen, um den Überblick über den Namen und die Spinner Position zu halten:

public class MainActivity extends AppCompatActivity { 

    String mName = "none"; 
    int mSpinnerPos = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //......... 
    } 

Ändern Ihr Spinner-Code, um den aktuell ausgewählten Index zu aktualisieren und den Namen durch den vom Benutzer gewählten zu ersetzen:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     switch (position) { 
      case 0: 
       mSpinnerPos = 0; 
       txt.setText(R.string.item_0); 
       image.setImageResource(R.drawable.bg); 
       break; 
      case 1: 
       mSpinnerPos = 1; 
       txt.setText(String.format(getString(R.string.item_1), mName)); 
       image.setImageResource(R.drawable.item1); 
       break; 
      case 2: 
       mSpinnerPos = 2; 
       txt.setText(String.format(getString(R.string.item_2), mName)); 
       image.setImageResource(R.drawable.item2); 
       break; 
      default: 
       //Default image 
       //image.setImageResource(R.drawable.item2); 
       break; 

     } 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 
}); 

Und das gleiche für die Schaltfläche Click-Ereignis:

public void addName(View view) { 
    EditText editext = (EditText) findViewById(R.id.editText2); 
    mName = editext.getText(); 

    TextView txt = (TextView) findViewById(R.id.textView4); 
    switch (mSpinnerPos) { 
     case 0: 
     //nothing to do 
     break; 
     case 1: 
     txt.setText(String.format(getString(R.string.item_1), mName)); 
     break; 
     case 2: 
     txt.setText(String.format(getString(R.string.item_2), mName)); 
     break; 
    } 
} 
+0

Danke, aber hier "txt.setText (String.format (getString (R.string.item_2), MNAME)); " es gibt einen Fehler "Wrong Argument Zahl, Format-String item_2 erfordert 2, aber Format Aufruf liefert 1" – JonD

+0

@JonD ich tat dies ohne eine IDE, lassen Sie mich überprüfen, dass –

+0

Dank und theese (String MNAME = "none"; int mSpinnerPos = 0;) eine statische oder? Wie: statische Zeichenfolge mName = "none"; statisch int mSpinnerPos = 0; – JonD

1

Sie können die unten stattdessen als eine sehr einfache Lösung verwenden (direkt ersetzen "none" mit dem Namen):

txt.setText(txt.getText().toString().replace("none", editext.getText().toString())); 

Hinweis: Sie können dies nur tun, wenn das Wort "none" vorhanden ist. Dies funktioniert nicht, wenn Sie einen Namen durch einen anderen Namen ersetzen möchten.

Ich bin überrascht, dass Sie in der Lage sind, die replace(int start, int end, CharSequence text) Methode zu bekommen, da das Teil der Editable Klasse ist. Mein Android Studio beschwert sich, dass es nicht da ist.

+0

Ja, das ist, warum ich ein „Hinweis“ oben links und erwähnte auch, dass meine Antwort nur eine schnelle Lösung ist. – kRiZ

0

Also, anstatt eine Textansicht zu splicen, wäre es besser, eine separate Textansicht zu erstellen, und nur den Text für diese eine Textansicht festzulegen. Zum Beispiel ist hier eine andere Textview von id „name“ ist

<TextView 
    android:id="@+id/textView4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="firstString" 
    app:layout_constraintRight_toLeftOf="@+id/name" 
    android:layout_marginRight="7dp" 
    android:layout_marginLeft="8dp" 
    app:layout_constraintLeft_toLeftOf="@+id/editText2" 
    app:layout_constraintHorizontal_bias="0.503" 
    android:layout_marginTop="32dp" 
    app:layout_constraintTop_toBottomOf="@+id/editText2" /> 

<TextView 
    android:id="@+id/name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="nameString" 
    android:layout_marginTop="0dp" 
    app:layout_constraintTop_toBottomOf="@+id/textView4" 
    android:layout_marginBottom="0dp" 
    app:layout_constraintBottom_toTopOf="@+id/textView4" 
    android:layout_marginRight="8dp" 
    app:layout_constraintRight_toRightOf="@+id/button3" /> 

In Ihrem Code, ich habe alle Ihre Ansicht Variablen an die Spitze der Klasse bewegt ... Sie sie in onCreate initialisieren und dann können Sie referenziere sie überall in deiner Aktivität. Dies bedeutet, dass Sie sie nur einmal deklarieren müssen.

public class MainActivity extends AppCompatActivity { 

TextView result; 
ImageView image; 
TextView txt; 
EditText editText; 

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

    Spinner spinner = (Spinner) findViewById(R.id.spinner2); 
    String string = String.valueOf(spinner.getSelectedItem()); 

    result=(TextView)findViewById(R.id.name); 




    image = (ImageView)findViewById(R.id.image); 
    txt = (TextView) findViewById(R.id.textView4); 
    editText = (EditText) findViewById(R.id.editText2); 



    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      switch (position) { 
       case 0: 
        txt.setText("Select an item"); 
        break; 
       case 1: 
        txt.setText("The name of item1 is none"); 
        break; 
       case 2: 
        txt.setText("The name of item2 is none"); 
        break; 
       default: 
        //Default image 
        //image.setImageResource(R.drawable.item2); 
        break; 

      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 

} 

public void addName(View view) { 
    result.setText(editText.getText()); 
} 

}

Beachten Sie, dass in Addname, ich bin genau das Ergebnis Textview mit dem Text aus dem Bearbeiten von Texteinstellung ohne dass spinner Ergebnis Textview zu ändern.

Hoffe, das hilft!

EDIT

Außerdem, wenn Sie die gleiche Textansicht verwenden möchten, anstatt sie zu ersetzen, können Sie immer textview.append tun ("Yourstring"). Das könnte einfacher sein.

Verwandte Themen