2017-09-26 11 views
0

私は非常に基本的な例で、スピナーの項目を選択することができ、選択した項目に応じて、画像ビューに対応する画像が表示されます。ボタンをクリックするとテキストビューの単語が1つ変更されます

また、デフォルトで「アイテムを選択」と言うテキストビューがあり、アイテム1が選択されている場合、このテキストビューには「アイテム1の名前はありません」と表示され、アイテム2が選択されると、 2はありません "。

私はeditextとボタンを持っていて、editextに名前を入力したいのですが、editext(例えばJohn)に名前を入力してボタンをクリックすると、textview 「item1の名前はjohnです」に変更されます。私は下のコードを試していますが、動作しません。あなたは解決する方法を知っていますか?

例:「john」と入力してボタンをクリックすると、「item2の名前がjohn」と表示されるのではなく、「john item2の名前がnone」と表示されます。

活動の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> 

文字列の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> 

コード:

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

「**働いていない」ということはどういう意味ですか?ボタンをクリックすると何が行われますか? – kRiZ

+0

"john"と書いてボタンをクリックすると、 "item2の名前がjohn"と表示されるのではなく、 "john item2の名前がnone"と表示されます。 – JonD

+0

実際には、スピナーの名前と位置を保存して、それに基づいて文字列を置換する必要があります。 –

答えて

2

文字列にトークンを使用し、ユーザーが選択した名前に置き換えてください。 これを行うこの方法には、ユーザーがスピナーの選択を変更しても、ユーザーが選択した名前がTextViewで置き換えられるという追加の利点があります。

まず、トークンのプレースホルダで、あなたのstrings.xmlに、あなたの文字列を追加します。

<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> 

を次に名前とスピナの位置を追跡するために、メンバ変数を作成します。

public class MainActivity extends AppCompatActivity { 

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

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

修正現在選択されているインデックスを更新するスピナーコードと、ユーザーが選択したインデックスで名前を置き換えます。

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) { 

    } 
}); 

ボタンのクリックでも同様の操作を行います。

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

ありがとうございますが、ここでは "txt.setText(String.format(getString(R.string.item_2)、mName)); "エラーが発生しました "間違った引数の数、フォーマット文字列item_2は2を必要としますが、通話用の書式は1です" – JonD

+0

@JonD IDEなしでこれを行いました。 –

+0

ありがとう、theese(String mName = "none"; int mSpinnerPos = 0;)は静的な権利が必要ですか? Like:静的String mName = "none"; 静的int mSpinnerPos = 0; – JonD

1

あなたは非常に簡単な修正は、(直接 "none" を交換しないと代わりに以下を使用することができます名前付き):

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

:「なし」という単語が存在する場合にのみこれを実行できます。これは、名前を別の名前に置き換えたい場合には機能しません。

Editableクラスの一部であるreplace(int start, int end, CharSequence text)メソッドを取得できることに私は驚いています。私のAndroidスタジオはそこにないと不平を言う。

+0

私は上記の「メモ」を残しておき、また私の答えは即時修正だと言いました。 – kRiZ

0

テキストビューをスプライスするのではなく、別のテキストビューを作成してそのテキストビューのテキストを設定する方がよいでしょう。例えば、ここではIDの別のTextViewがあなたのコードでは、「名前」

<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" /> 

で、私はクラスのトップにあなたのビュー変数のすべてを移動している...あなたはのonCreateでそれらを初期化することができ、その後のことができますあなたの活動のどこにでもそれらを参照してください。つまり、それらを一度宣言するだけです。 addNameで、私はちょうどそのスピナー結果のTextViewを変更することなく、エディットテキストからテキストとその結果のTextViewを設定してること

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()); 
} 

}

注意してください。

希望すると便利です。

EDIT

あなたの代わりに置き換えるので、同じテキストビューを使用する場合はさらに、あなたは常に( "yourString")textview.appendを行うことができます。それはもっと簡単かもしれません。

関連する問題