2017-09-26 111 views
0

我有一個非常基本的示例,允許用戶在微調框中選擇一個項目,並根據所選項目在圖像視圖中顯示對應圖像。在點擊按鈕時更改文本視圖的一個字

此外,我有一個默認說「選擇一個項目」的文本視圖,當選擇項目1時,此文本視圖顯示「項目1的名稱是無」,當選擇項目2時,出現「項目的名稱2不是「。

現在我有一個editext和一個按鈕,我想在editext中輸入一個名稱,當我在editext中輸入一個名稱(例如John)並單擊按鈕時,我希望textview中的文本更改爲「item1的名稱是約翰」。我試着用下面的代碼,但它不工作。你知道如何解決?

例如:如果我編寫「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(字符串mName =「無」; int mSpinnerPos = 0;)需要一個靜態的權利?像:static String mName =「none」; static int mSpinnerPos = 0; – JonD

1

您可以使用下面的,而不是作爲一個非常簡單的解決方法(直接取代 「無」與名字):

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

注意:只有在單詞「none」存在的情況下才能做到這一點。如果您想用另一個名稱替換名稱,這將不起作用。

我很驚訝您能夠獲得replace(int start, int end, CharSequence text)方法,因爲這是Editable類的一部分。我的Android Studio抱怨說它不在那裏。

+0

是的,這就是爲什麼我在上面留下了「註釋」,並且還提到我的回答只是一個快速解決方案。 – kRiZ

0

所以,不是拼接一個文本視圖,而是更好地創建一個單獨的文本視圖,並設置該文本視圖的文本。例如,這裏是id爲「名」

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

在你的代碼中的另一個TextView的,我已經感動了所有的視圖變量到類的頂部...你可以在初始化的onCreate他們,然後就可以在你的活動中隨處可見。這意味着你只需要申報一次。

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

}

注意,在addName,我只是設置從編輯文本的文本結果的TextView,而不必改變微調結果的TextView。

希望這會有所幫助!

編輯

此外,如果你想使用的,而不是替換相同的文本視圖,你總是可以做textview.append( 「yourString」)。這可能更簡單。

相關問題