Java 如何在android上为动态创建的按钮设置不同的操作(特别是-使用动态按钮自动滚动到文本视图)
我创建了一个包含多个文本视图的布局。 我将文本视图的ID保存在一个名为_resultId的类变量ArrayList中 现在我想创建一些按钮,这些按钮可以滚动到正确的文本视图 (第一个文本视图的第一个按钮等) 问题是:如何将正确的id传递给按下方法的每个按钮 我尝试使用全局变量计数器,但当我运行程序时,所有按钮都会滚动到最后一个文本视图 方法代码:Java 如何在android上为动态创建的按钮设置不同的操作(特别是-使用动态按钮自动滚动到文本视图),java,android,button,scroll,onclick,Java,Android,Button,Scroll,Onclick,我创建了一个包含多个文本视图的布局。 我将文本视图的ID保存在一个名为_resultId的类变量ArrayList中 现在我想创建一些按钮,这些按钮可以滚动到正确的文本视图 (第一个文本视图的第一个按钮等) 问题是:如何将正确的id传递给按下方法的每个按钮 我尝试使用全局变量计数器,但当我运行程序时,所有按钮都会滚动到最后一个文本视图 方法代码: private void addNavigationView(ViewGroup navigationLayout, ArrayList<Per
private void addNavigationView(ViewGroup navigationLayout, ArrayList<Perek> mishnayot)
{
for (int i=0;i<mishnayot.size();i++)
{
_counter=i;
String currentOt=mishnayot.get(i).getOt();
Button button = new Button(getBaseContext());
button.setText(currentOt);
if (_resultId==null)
throw new IllegalAccessError("missing result id link cannot be created");
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0) //make it scroll to correct textview
{
new Handler().post(new Runnable()
{
@Override
public void run()
{
View currentView=findViewById(_resultId.get(_counter));
ScrollView scrollView=(ScrollView) findViewById(R.id.resultScroll);
scrollView.scrollTo(0, currentView.getTop());
}
});
}
});
navigationLayout.addView(button);//add the button to panel
}
navigationLayout.setVisibility(View.VISIBLE);
}
private void addNavigationView(视图组navigationLayout,ArrayList mishnayot)
{
对于(int i=0;i在了解了更多关于Runnable接口的内容后,我找到了一个答案,对于那些将在类似问题上挣扎的人:
您需要创建一个同时实现runnable和OnClickListener的新类
这个类将包含额外的数据和一个符合您需要的构造函数。
设置按钮的onClick方法时,将创建该类的新对象。
例如,在我的例子中,新方法如下所示:
public class ButtonHandler implements OnClickListener,Runnable
{
private String _data;//data to be passed for the button
private ArrayList<Integer> _resultId;//the id's of the text views
private Activity _activity;
public ButtonHandler(String data,ArrayList<Integer> resultId,Activity activity)
{
_data=data;
_resultId=resultId;
_activity=activity;
}
@Override
public void run()
{
View currentView=_activity.findViewById(_resultId.get(Integer.valueOf(_data)));
ScrollView scrollView=(ScrollView) _activity.findViewById(R.id.resultScroll);
scrollView.scrollTo(0, currentView.getTop());
}
@Override
public void onClick(View v)
{
new Handler().post(this);
}
}
公共类ButtonHandler实现OnClickListener,可运行
{
私有字符串_data;//要为按钮传递的数据
private ArrayList _resultId;//文本视图的id
私人活动;
公共按钮句柄(字符串数据、ArrayList结果、活动)
{
_数据=数据;
_resultId=resultId;
_活动=活动;
}
@凌驾
公开募捐
{
View currentView=_activity.findViewById(_resultId.get(Integer.valueOf(_data));
ScrollView ScrollView=(ScrollView)\ u activity.findViewById(R.id.resultScroll);
scrollView.scrollTo(0,currentView.getTop());
}
@凌驾
公共void onClick(视图v)
{
新处理程序().post(此);
}
}
现在从我使用的主要活动中调用它:
private void addNavigationView(ViewGroup navigationLayout, ArrayList<Perek> mishnayot)
{
for (int i=0;i<mishnayot.size();i++)
{
_counter=i;
String currentOt=mishnayot.get(i).getOt();
Button button = new Button(getBaseContext());
button.setText(currentOt);
if (_resultId==null)
throw new IllegalAccessError("missing result id link cannot be created");
button.setOnClickListener(new ButtonHandler(i+"",_resultId,this));
navigationLayout.addView(button);//add the button to panel
}
navigationLayout.setVisibility(View.VISIBLE);
}
private void addNavigationView(视图组navigationLayout,ArrayList mishnayot)
{
对于(int i=0;i