更改使用按钮点击TextView的文本中的Android

问题描述:

我想更改按钮上的点击textView文本。活动中可以有多个按钮。主要目的是改变按钮上的水果名称,点击任一按钮。 例如:按钮1点击更改名称,按钮2点击下一个名称,按钮3点击下一个名称等。我正在尝试如下给出,但名称不会改变。更改使用按钮点击TextView的文本中的Android

主要活动

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

public class MainActivity extends AppCompatActivity { 

    private TextView sentence_etx; 
    private Button btn_1,btn_2; 
    private String[] names = { "Apple","Mango","Cherry","Banana","Extra"}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sentence_etx = (TextView) findViewById(R.id.etx_sentence); 
     btn_1 = (Button) findViewById(R.id.btn_1); 
     btn_2 = (Button) findViewById(R.id.btn_2); 

     for (int i=0;i<=names.length;i++) { 
      work(i); 
     } 
    } 

    private void work(final int i) { 
      btn_1.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        sentence_etx.setText(names[i]); 
       } 
      }); 

      btn_2.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        sentence_etx.setText(names[i]); 
       } 
      }); 
    } 
} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.awais.test2.MainActivity"> 




    <LinearLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_marginTop="50dp" 
      android:layout_marginRight="30dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/etx_sentence" 
      android:text="Names......" /> 

     <LinearLayout 
      android:gravity="center" 
      android:layout_marginTop="100dp" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent"> 


     <Button 
      android:layout_height="50dp" 
      android:layout_width="50dp" 
      android:id="@+id/btn_1" 
      android:text="1"/> 

     <Button 
      android:layout_height="50dp" 
      android:layout_width="50dp" 
      android:id="@+id/btn_2" 
      android:text="2"/> 

     <Button 
      android:layout_height="50dp" 
      android:layout_width="50dp" 
      android:id="@+id/btn_3" 
      android:text="3"/> 

     </LinearLayout> 


    </LinearLayout> 

</RelativeLayout> 

删除for因为监听器需要设置一次

for (int i=0;i<=names.length;i++) { 
     work(i); 
    } 

所以work的签名将是

private void work() { 

,并调用它从onCreate

一次声明i全球,把一个if条件而设定的下一个值,以避免指数势必异常

public class MainActivity extends AppCompatActivity { 

    private int i=0; 
    // code 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // code 
     btn_1 = (Button) findViewById(R.id.btn_1); 
     btn_2 = (Button) findViewById(R.id.btn_2); 
     // initialize listener 
     work(); 
    } 

    private void work() { 
      btn_1.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // check bounds 
        if (++i<names.length) { 
         sentence_etx.setText(names[i]);      
        } 
        // else{ // uncomment to reset the value of i 
        //  i=0; 
        // } 
       } 
      }); 

      btn_2.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (++i<names.length) { 
         sentence_etx.setText(names[i]);      
        } 
        // else{ // uncomment to reset the value of i 
        //  i=0; 
        // } 
       } 
      }); 
    } 
} 

你所有buttons都在做同样的工作,所以你可以简单地有listener并将其应用在所有button对象,而不是创建单独的匿名听众和

public class MainActivity extends AppCompatActivity { 

    private TextView sentence_etx; 
    private Button btn_1,btn_2; 
    private String[] names = { "Apple","Mango","Cherry","Banana","Extra"}; 
    private int i=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sentence_etx = (TextView) findViewById(R.id.etx_sentence); 
     btn_1 = (Button) findViewById(R.id.btn_1); 
     btn_2 = (Button) findViewById(R.id.btn_2); 

     // initialize listener 
     btn_1.setOnClickListener(listner); 
     btn_2.setOnClickListener(listner); 
    } 

    OnClickListener listner=new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // check bounds 
      if (++i<names.length) { 
       sentence_etx.setText(names[i]);      
      } 
      // else{ // uncomment to reset the value of i 
      //  i=0; 
      // } 

      // note you can also add some conditional statement 
      // to check which button is clicked using v.getId();    
     } 
    }; 

} 

你正在重置您的按钮的每次调用work时间OnClickListener。如果你希望他们显示不同的名字,你不能分配他们相同的OnClickListener(这是你现在所做的)。

你可以做的是改变work签名接收按钮作为参数,设置监听器上按钮。然后,在onCreate方法,您决定哪名与哪个按钮

你只需要设置OnClickListener一次

public class MainActivity extends AppCompatActivity { 

    private TextView sentence_etx; 
    private Button btn_1,btn_2; 
    private String[] names = { "Apple","Mango","Cherry","Banana","Extra"}; 
    private int curIndex = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sentence_etx = (TextView) findViewById(R.id.etx_sentence); 
     btn_1 = (Button) findViewById(R.id.btn_1); 
     btn_2 = (Button) findViewById(R.id.btn_2); 

     btn_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (curIndex == names.length - 1) { 
        curIndex = 0; 
       } 
       sentence_etx.setText(names[curIndex]); 
       curIndex++; 
      } 
     }); 

     btn_2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (curIndex == names.length - 1) { 
        curIndex = 0; 
       } 
       sentence_etx.setText(names[curIndex]); 
       curIndex++; 
      } 
     }); 
    } 

} 
+0

'名称[0],名称[1]'应该是通用的。目的是在单击任何按钮时更改名称(数组中的下一个名称)。 – Amar

+0

@Amar更新了代码 – Junyu

+0

@Amar它帮助你解决了你的问题吗?如果是这样,请标记为已接受的答案。 – Junyu