如何将arraylist传递给onClick的方法
Posted
技术标签:
【中文标题】如何将arraylist传递给onClick的方法【英文标题】:How to pass arraylist into a method from onClick 【发布时间】:2016-11-01 23:04:07 【问题描述】:我的问题是我有一个创建数组列表的方法。我可以根据需要将其传递给其他方法以供使用。但是,当用户单击使用先前创建的数组列表但我不知道该怎么做的“计算”按钮时,我想调用一个方法calculate
。
我最接近的是将我的数组列表声明为全局变量,但我知道全局变量通常很糟糕,即使这样我在代码的最后一行 lookUpMethod(al, lookUpString);
上也得到了一个 Cannot resolve symbol 'al'
。
我不确定我做错了什么或最好的处理方法是什么。
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String []> al = new ArrayList<>(); //tried global variable
exampleArrayListofArray (al);
public void exampleArrayListofArray (List<String []> al)
//ArrayList<String []> al = new ArrayList<>(); //original array list declaration
al.add(new String[] "AB","YZ","12");
al.add(new String[] "CD","WX", "34");
al.add(new String[] "EF","UV", "56");
al.add(new String[] "GH","ST", "78");
al.add(new String[]"IJ", "QR", "91");
al.add(new String[]"KL", "OP", "10");
displayArrayListofArray(al);
public void displayArrayListofArray(List<String[]> al)
for (String [] row : al)
for (int column = 0; column <= 2 ; column ++)
System.out.println("Value at Index Row " + al.indexOf(row) +
" Column " + column + " is " + (row)[column]);
EditText userField = (EditText) findViewById(R.id.user_field);
String lookUpString = userField.getText().toString();
lookUpMethod(al, lookUpString);
public void lookUpMethod(List<String[]> al, String lookUpString)
boolean isStringFound = false;
for (String[] row : al)
for (int column = 0; column <= 2; column++)
if (al.get(al.indexOf(row))[column].equals(lookUpString))
System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column);
isStringFound = true;
if (!isStringFound)
System.out.println("Search string '" + lookUpString + "' does not exist.");
public void calculate(View view)
EditText userField = (EditText) findViewById(R.id.user_field);
String lookUpString = userField.getText().toString();
System.out.println("user input : " + lookUpString);
lookUpMethod(al, lookUpString);
【问题讨论】:
你想将数据传递给另一个活动? 我已经阅读了您的代码,但在方法计算中没有看到任何定义。如果你想使用它,你可以在变量 global 中定义 【参考方案1】:范围:局部变量仅在声明它们的方法或块中可见,而实例变量可以在类中的所有方法中看到。声明位置:局部变量在方法或块内声明,而实例变量在类内但在方法外声明。
你需要声明
ArrayList<String []> al = new ArrayList<>();
在 onCreate 函数之外。
【讨论】:
【参考方案2】:您需要将函数外部的arrayList 声明作为全局变量。
ArrayList al = new ArrayList();
【讨论】:
【参考方案3】:在onCreate
函数之外声明ArrayList<String []> al = new ArrayList<>();
。
我真的不明白这样会有什么问题,因为现在所有函数都会看到你的变量。作为清理,您可以在调用函数时删除变量al
,因为它不再需要,因为现在每个函数都可以看到它。如果我没记错的话,你的最终代码应该是这样的:
public class MainActivity extends AppCompatActivity
ArrayList<String []> al = new ArrayList<>(); //declare it here
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
exampleArrayListofArray ();
public void exampleArrayListofArray ()
al.add(new String[] "AB","YZ","12");
al.add(new String[] "CD","WX", "34");
al.add(new String[] "EF","UV", "56");
al.add(new String[] "GH","ST", "78");
al.add(new String[]"IJ", "QR", "91");
al.add(new String[]"KL", "OP", "10");
displayArrayListofArray();
public void displayArrayListofArray()
for (String [] row : al)
for (int column = 0; column <= 2 ; column ++)
System.out.println("Value at Index Row " + al.indexOf(row) +
" Column " + column + " is " + (row)[column]);
EditText userField = (EditText) findViewById(R.id.user_field);
String lookUpString = userField.getText().toString();
lookUpMethod(lookUpString);
public void lookUpMethod(String lookUpString)
boolean isStringFound = false;
for (String[] row : al)
for (int column = 0; column <= 2; column++)
if (al.get(al.indexOf(row))[column].equals(lookUpString))
System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column);
isStringFound = true;
if (!isStringFound)
System.out.println("Search string '" + lookUpString + "' does not exist.");
public void calculate(View view)
EditText userField = (EditText) findViewById(R.id.user_field);
String lookUpString = userField.getText().toString();
System.out.println("user input : " + lookUpString);
lookUpMethod(lookUpString);
请注意我是如何在您的函数调用和函数参数中删除“al”的。将al
作为通过函数传递的局部变量的问题在于,当您点击calculate
按钮时,calculate
函数看不到al
,除非它是一个全局变量。
去试试修改后的代码。
【讨论】:
噢!我以为我主要宣布了 al。 facepalm 我没有意识到我在 onCreate 方法中声明了它。 不要忘记在函数调用和声明中删除al
,以避免冗余和不必要的代码!这样一来,它就会变得可读和“优雅”! :)
现在完美运行。为什么我读到全局变量是坏消息?是否有另一种方法可以在不使用全局变量的情况下执行此操作,并且也许能够将 al 传递给另一个活动。 (我可能想在我的应用程序的未来版本中这样做)。
@Airfix 由于您活动中的每个函数都可以访问全局变量,因此可能很难跟踪哪些函数使用您的变量,并且当您的活动变大时很难确定哪些函数修改了您的变量。
但是,在您的情况下,全局变量不会是什么大问题,因为您还没有太多代码。【参考方案4】:
全局变量应该在 onCreate 之外定义,我认为这通常还不错,你可以试试这个代码:
public class MainActivity extends AppCompatActivity
private ArrayList<String []> al; //global variable in class
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
al = new ArrayList<>();
exampleArrayListofArray (al);
public void exampleArrayListofArray (List<String []> al)
//ArrayList<String []> al = new ArrayList<>(); //original array list declaration
al.add(new String[] "AB","YZ","12");
al.add(new String[] "CD","WX", "34");
al.add(new String[] "EF","UV", "56");
al.add(new String[] "GH","ST", "78");
al.add(new String[]"IJ", "QR", "91");
al.add(new String[]"KL", "OP", "10");
displayArrayListofArray(al);
public void displayArrayListofArray(List<String[]> al)
for (String [] row : al)
for (int column = 0; column <= 2 ; column ++)
System.out.println("Value at Index Row " + al.indexOf(row) +
" Column " + column + " is " + (row)[column]);
EditText userField = (EditText) findViewById(R.id.user_field);
String lookUpString = userField.getText().toString();
lookUpMethod(al, lookUpString);
public void lookUpMethod(List<String[]> al, String lookUpString)
boolean isStringFound = false;
for (String[] row : al)
for (int column = 0; column <= 2; column++)
if (al.get(al.indexOf(row))[column].equals(lookUpString))
System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column);
isStringFound = true;
if (!isStringFound)
System.out.println("Search string '" + lookUpString + "' does not exist.");
public void calculate(View view)
EditText userField = (EditText) findViewById(R.id.user_field);
String lookUpString = userField.getText().toString();
System.out.println("user input : " + lookUpString);
lookUpMethod(al, lookUpString);
【讨论】:
这不是一个全局变量。它只是一个实例变量 是的,就像我评论的那样,这只是类中的全局变量。这意味着它可以在这个类中访问,但不能从另一个类访问。也许它被称为实例变量:) 我的错误。我以为我已将其声明为全局变量 facepalm以上是关于如何将arraylist传递给onClick的方法的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 if else 然后将值传递给设置 onClick 时,如何获取微调器值?