我无法找到以下问题的答案:
如何在同一LinearLayout中使用View A和View B从View A到View B获取数据?这甚至可能吗?我是否需要开始使用线程?
我猜不到正确的搜索短语,我可能不是第一个想要这样做的人,但我找不到它:(
以下是我现在用来创建视图的内容。在TargetTrainer(扩展View)中,我让用户提供一些输入,我希望能够在TextView中向用户提供反馈。例如,我如何在TextView中显示TargetTrainer的onTouchEvent的坐标?
以下是我的程序的剪辑/简化版本。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout linear;
linear = new LinearLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);
TextView text = new TextView(this);
text.setText("Test");
linear.addView(text);
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
TargetTrainer t = new TargetTrainer(this, width, height);
linear.addView(t);
setContentView(linear);
}
答案 0 :(得分:1)
正如我从代码片段中看到的那样,您已经在构造函数new TargetTrainer(this, width, height)
中传递了Context。假设您提供的代码来自名为BaseActivity
的活动,请在BaseActivity
构造函数中创建对TargetTrainer
的引用,并从TargetTrainer
调用更新方法。
public TargetTrainer extends View {
....
BaseActivity mBaseActivity = null;
public MyView(Context context, int width, int height) {
....
mBaseActivity = (BaseACtivity)context;
....
}
....
private void update(String text)
{
mBaseActivity.updateTextView(text);
}
}
在BaseActivity
创建updateTextView
:
public void updateTextView(String updateText){
text.setText(updateText);
}
答案 1 :(得分:0)
您应该设置该TextView的ID,收听TargetTrainer中的触摸事件,并在发生一次时使用
final TextView tv = (TextView)TargetTrainer.this.findViewById(R.id.myTextView);
tv.setText(touchEvent.toString());
就是这样。
<强>更新强>
如果你从xml源构建主要布局,它会更清晰
您需要在/ res / layout中创建一个新的布局xml,它看起来就像您在onCreate
方法中创建的那个:
<强> RES /布局/ main.xml中强>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/myTextView" android:text="Test"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
<!-- change the your.package part to match the package declaration
of your TargetTrainer class -->
<your.package.TargetTrainer android:id="@+id/myTargetTrainer"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>
这样,一个新条目将被放置在R类的静态layout
类中,名称为main
。
您可以通过R.layout.main
引用它。
请注意,在此xml中,您为两个
定义了id属性myTextView
和 xml标记内的@ + id表示您正在使用“/”符号后面的名称创建新ID。
这也将在您的R类“静态id
类中创建新成员,其中包含您提供的名称:myTextView
和myTargetTrainer
,从现在开始可以从代码中的任何位置访问。
如果你已经构建了这个xml,那么onCreate
方法将如下所示:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// attach the OnTouchListener to your TargetTrainer view:
(TargetTrainer)findViewById(R.id.myTargetTrainer).setOnTouchListener(this);
}
您还必须扩展主活动类以实现View.OnTouchListener
接口,并在课程结束时添加必要的方法:
@Override
public boolean onTouch(View view, MotionEvent event)
{
//note, that here the view parameter is the view the touch event has been dispatched to
final TextView tv = (TextView)findViewById(R.id.myTextView);
tv.setText(event.toString());
return true; //or false, if you are dealing further with this event in parent classes
}