2017-09-26 112 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”)。这可能更简单。

相关问题