Java 用于LinearLayout的onTouch()函数不';行不通
我有文件第一级,用户从主文件(mainActivity)进入。当用户触摸屏幕时,我需要在FirstLevel中将LinearLayouts添加到屏幕中(这些LinearLayouts包含两个文本视图,并在单独的XML文件中实现)。但是,事实上,什么也没发生,我没有看到任何额外的线性布局Java 用于LinearLayout的onTouch()函数不';行不通,java,android,android-studio,Java,Android,Android Studio,我有文件第一级,用户从主文件(mainActivity)进入。当用户触摸屏幕时,我需要在FirstLevel中将LinearLayouts添加到屏幕中(这些LinearLayouts包含两个文本视图,并在单独的XML文件中实现)。但是,事实上,什么也没发生,我没有看到任何额外的线性布局 公共类第一级扩展AppCompatActivity实现View.OnTouchListener{ 图像按钮第一个按钮; //布尔标志=真; 字符串[]replics={…};//填充体量 字符串[]who={…}
公共类第一级扩展AppCompatActivity实现View.OnTouchListener{
图像按钮第一个按钮;
//布尔标志=真;
字符串[]replics={…};//填充体量
字符串[]who={…};
int i=0;
@SuppressLint(“ClickableViewAccessibility”)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局第一层);
LinearLayout gameWindow=findViewById(R.id.mesWin);
gameWindow.setOnTouchListener(这个);
}
void npcsay(字符串文本、字符串英雄)
{
LinearLayout gameWindow=findViewById(R.id.mesWin);
LinearLayout视图=(LinearLayout)getLayoutInflater().充气(R.layout.message,gameWindow,false);
TextView用户名=view.findviewbyd(R.id.name);
username.setText(英雄);
TextView ttxt=view.findViewById(R.id.point);
ttxt.setText(文本);
gameWindow.addView(视图,新的LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_父级,ViewGroup.LayoutParams.WRAP_内容));
}
@SuppressLint(“ClickableViewAccessibility”)
@凌驾
公共布尔onTouch(视图v,运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
npcsay(回复[i],世卫组织[i]);
i++;
返回true;
}
返回false;
}
}
First_level.xml
message.xml
这就是第一级XML的样子
使用“ViewGroup.addView(child,LayoutParams)”而不是“addView()”通常是一种很好的做法,尤其是当XML布局将主视图组设置为“宽度/高度:匹配父视图”时。实际上,分配给任何膨胀视图(使用“addView(子)”的默认布局参数对于宽度和高度都是“包裹内容”,这样膨胀视图就无法很好地测量,其尺寸将为[0,0] 请检查您的XML布局文件:它应该可以从自己的角度测量(换句话说,它不应该取决于父视图的宽度/高度)。如果它应该取决于父视图的视图组,那么您不能使用“addView(child)”,但您需要
- addView(子对象,新的LinearLayout.LayoutParams(…,…)
如果您不确定,请发布您的XML“R.layout.message”文件。我发现了您的问题。
您将onTouchListener设置为LinearLayout(R.id.mesWin)。
但LinearLayout的大小为0。(因为您将其大小设置为包裹内容。
所以你可以用两种方法来修复它 第一种方法:
您可以将TouchListener更改为gameWindow
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_level);
View gameWindow = findViewById(R.id.gameWindow);
gameWindow.setOnTouchListener(this);
}
第二种方法:
您可以更改线性布局(mesWin)的高度。因此,您需要向ScrollView添加fillViewport=“true”选项
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/gameWindow"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/fillback"
android:orientation="vertical"
tools:context=".MainActivity"
android:fillViewport="true">
<LinearLayout
android:id="@+id/mesWin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
非常感谢!正如您所说,我编辑了我的文件,但它仍然不起作用,我相信问题在于与函数onTouch()的绑定,因为当我只是将linearLayout添加到主linearLayout(不带onTouch)时,一切都可以正常工作Nope,onTouch()不能破坏任何东西,因为它像其他活动方法一样在Main/UiThread中运行。我认为在“其他地方”它的工作主要是幸运的,而不是因为它是正确的方式。编程是可靠的/稳定的,并且“有时”或“只有在我将代码放在这里时”无法工作……很好@emandt,我明白了!请检查XML“消息”好吗我发布的文件?似乎我编辑的文件不正确(1)“fill_parent”是弃用的/多年来不再使用的旧属性值。请将其替换为“match_parent”。(2)您是否在正确的位置和正确的宽度/高度看到ScrollView“fillblack”背景?(如果可以,发布结果视图的图片)(1)修复!(2)我相信一切都很好,上传了图片hi,你能发布first_level.xml文件吗,这样我就可以调试你的问题了。嗨,@Daniel.Wang,成功了!更新了我的答案,请检查一下。将来:请不要以使现有答案无效的方式编辑问题。改为问新问题。尝试了,但没有改变。嗨,更新了答案。请检查一下。