Android Studio 3中无法从独立OnClickListener类获取EditText值
问题根源 & 解决方案
嘿,这问题我太熟了!你之所以拿不到EditText的内容,核心原因是你在点击事件里重新inflate了一个全新的activity_main布局——这个新布局完全独立于当前屏幕上显示的界面,里面的EditText自然是空的,用户输入的内容根本不在这个新实例里。
方法1:直接获取当前界面的EditText(最简单)
不用重新inflate布局,直接通过点击的View获取根布局,找到对应的EditText即可:
public class OnClickListenerGenerate implements View.OnClickListener { private static final String TAG = OnClickListenerGenerate.class.getSimpleName(); @Override public void onClick(View view) { // 直接从当前界面的根布局找EditText,而非新建布局实例 EditText second_digit = view.getRootView().findViewById(R.id.txtSecondDigit); Log.d(TAG, ">>" + second_digit.getText().toString()); } }
方法2:把EditText实例传给点击事件类
在MainActivity里先拿到EditText的引用,再通过构造函数传给点击事件类:
首先修改MainActivity:
public class MainActivity extends AppCompatActivity { Button btnGenerate; EditText second_digit; // 先获取当前界面的EditText引用 private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnGenerate = findViewById(R.id.generate_btn); second_digit = findViewById(R.id.txtSecondDigit); // 初始化EditText // 将EditText传入点击事件类 btnGenerate.setOnClickListener(new OnClickListenerGenerate(second_digit)); } }
然后修改OnClickListenerGenerate:
public class OnClickListenerGenerate implements View.OnClickListener { private EditText second_digit; // 保存传入的EditText实例 private static final String TAG = OnClickListenerGenerate.class.getSimpleName(); // 构造函数接收EditText public OnClickListenerGenerate(EditText editText) { this.second_digit = editText; } @Override public void onClick(View view) { Log.d(TAG, ">>" + second_digit.getText().toString()); } }
方法3:使用内部类(Android开发更常用的写法)
把点击事件类改成MainActivity的内部类,这样可以直接访问外部类的控件引用,代码更简洁:
public class MainActivity extends AppCompatActivity { Button btnGenerate; EditText second_digit; private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnGenerate = findViewById(R.id.generate_btn); second_digit = findViewById(R.id.txtSecondDigit); btnGenerate.setOnClickListener(new OnClickListenerGenerate()); } // 改为内部类,直接访问外部类的second_digit private class OnClickListenerGenerate implements View.OnClickListener { private static final String TAG = OnClickListenerGenerate.class.getSimpleName(); @Override public void onClick(View view) { Log.d(TAG, ">>" + second_digit.getText().toString()); } } }
这三种方法都能解决你的问题,选哪种看你的代码结构偏好~
内容的提问来源于stack exchange,提问作者Ran Lorch
相关产品推荐
相关产品推荐

