获取视图位置的方法返回0

这个问题已经被多次提出,但是每个人都给出了发生这种情况的原因(即计算在布局之前发生)。 但我需要这个解决scheme。 我试过getBottom();getTop();getLocationOnScreen(int[] location); 。 但全部返回值零(0)。 我甚至尝试在onStart(); ,给布局铺平了时间,但没有运气。 这是我的代码:

 TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1); Log.d("getBottom :", Integer.toString(tv.getBottom())); Log.d("gettop :", Integer.toString(tv.getTop())); int[] location = new int[2]; tv.getLocationOnScreen(location); Log.d("getlocationonscreen values :", Integer.toString(location[0])+" "+Integer.toString(location[1])); } @Override protected void onStart() { Log.d("getBottom in onStart :", Integer.toString(tv.getBottom())); Log.d("gettop in onStart :", Integer.toString(tv.getTop())); int[] location = new int[2]; tv.getLocationOnScreen(location); Log.d("getlocationonscreen in onStart :", Integer.toString(location[0])+" "+Integer.toString(location[1])); super.onStart(); } 

布局XML:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="156dp" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </RelativeLayout> 

再次,我很抱歉重复这个问题。 提前致谢。

你把'测量'放在onWindowFocusChanged()方法中。
正如文档所述:

这是该活动是否对用户可见的最好指标。

你也可以把它放在onResume()这是应用程序完全在屏幕上并且处于活动状态之前的最后一步,但是:

请记住,onResume不是您的活动对用户可见的最佳指标; 系统窗口如键盘可能在前面。 使用onWindowFocusChanged(boolean)可以确定您的活动对用户是可见的(例如,恢复游戏)。

如果窗口/视图尚未显示,则不能保证它具有其测量结果,因此以前的方法会更好。

   

在将控制转移到端点0之前,是否需要声明一个接口?

我有一个游戏控制器连接到我的Android设备,它有一个端口中断的接口。 我知道,Android在枚举端点时列出了端点0(控制端点),并且我知道只要通过任何其他端点发送到端点0,就可以将控制转移到端点0。

我的问题是:我需要声称一个接口(任何接口),在我做这个控制转移之前? 在与技术上不属于任何接口的端点0交谈之前,Android框架是否要求您获得对接口的独占访问?

是。 你会看到,没有强制要求界面,任何controlTransfer调用失败。

不幸的是,声称断开了USB设备与内核驱动程序的连接。 所以,如果你想在使用USB鼠标的时候改变分辨率,你会发现改变之后,鼠标不再控制你的Android设备。

   

“这个应用程序可用于超过0个设备。”

我继续得到这个,因为我正在上传我的Android应用程序信息,屏幕截图和其他信息:

此应用程序可用于超过0个设备。

在此之前它显示:

屏幕布局:正常大XLARGE
所需的设备function
android.hardware.touchscreen
android.hardware.screen.portrait

这是什么原因造成的?

你有没有激活Android 应用程序包文件(APK) ?

兼容性 ,有可用性 。 您的错误消息特指可用性

为了使您的应用程序可用,您首先必须激活它。 您可以在高级模式下通过突出显示您的软件包并单击激活来完成此操作。

切换到APK文件标签。 在高级模式下点击激活旁边的APK文件。 这对我有效。

   

值总是返回0,它应该返回插入的行数

我有两个表,一个是Information ,另一个是WorkForce

信息

在这里输入图像说明

劳动力

在这里输入图像说明

WorkForce中的twf column用于获取Informationid ,假设返回值为1,但返回值为0.如果Information中id 5, twf应该是5。

首先,我使用a来表示所选行的数量,然后将a的参数添加到addWorkForcetoast总是显示0。

  a=addInformation(name,weather,date2,status,first1[1],last1[1]); Toast.makeText(getApplicationContext(),a+"",Toast.LENGTH_LONG).show(); addWorkForce(Sub, NoP, NoH,a); 

addInformation函数

  public long addInformation( final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) { class AddInfo extends AsyncTask<String, Void, String> { ProgressDialog loading; @Override protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); loading.dismiss(); Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); } @Override protected String doInBackground(String... params) { HashMap<String, String> data = new HashMap<String,String>(); data.put(Config.KEY_USER_NAME,name); data.put(Config.KEY_WEATHER,weather); data.put(Config.KEY_DATE,date2); data.put(Config.KEY_STATUS,status); data.put(Config.KEY_TIMEIN,timeIn); data.put(Config.KEY_TIMEOUT,timeOut); RequestHandler rh=new RequestHandler(); String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); return result; } } AddInfo ru = new AddInfo(); ru.execute(name,weather,date2,status,timeIn,timeOut); return 0; } 

有人能帮我弄清楚这个问题吗?

addInformation.php

 <?php if($_SERVER['REQUEST_METHOD']=='POST'){ //Getting values $name = $_POST['name']; $weather = $_POST['weather']; $date = $_POST['date']; $status = $_POST['status']; $timeIn = $_POST['timeIn']; $timeOut = $_POST['timeOut']; //Creating an sql query $sql = "INSERT INTO information(name, weather, date, status, time_in, time_out) VALUES ('$name','$weather','$date', '$status', '$timeIn', '$timeOut')"; //Importing our db connection script require_once('dbConnect.php'); //Executing query to database if(mysqli_query($con,$sql)){ echo 'Information Added Successfully'; }else{ echo 'Could Not Add Information'; } //Closing the database mysqli_close($con); } ?> 

这是我如何使用代码来获取插入sqlite的行,它的工作原理

  a = ts.insertTimeSheet(name, weather, date2, status, first1[1], last1[1]); 

时间表

  public long insertTimeSheet(String name, String weather, String date, String status, String TimeIn, String TimeOut) { database = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(MyDatabaseHelper.Name, name); values.put(MyDatabaseHelper.Weather, weather); values.put(MyDatabaseHelper.Date, date); values.put(MyDatabaseHelper.Status, status); values.put(MyDatabaseHelper.TimeIn_Info, TimeIn); values.put(MyDatabaseHelper.TimeOut_Info, TimeOut); return database.insert(MyDatabaseHelper.TABLE_INFO, null, values); // if the id in Information is 5, twf display 5 too 

根据你的代码添加信息:

 a=addInformation(name,weather,date2,status,first1[1],last1[1]); 

在这里,你正在主线程上调用addInformation ,并把返回值保存到variablesa中。 但问题是,添加信息的实际实现是在doInBackgroundAsyncTask完成的,它实际上是在一个工作线程(asynchronous调用)上完成这个工作,所以你将总是得到a = 0的默认值(因为很长)。

你需要做的是将你的代码移动到AsyncTask onPostExecute函数,如下所示:

 public void addInformation( final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) { class AddInfo extends AsyncTask<String, Void, String> { ProgressDialog loading; @Override protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); loading.dismiss(); Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); addWorkForce(Sub, NoP, NoH,a); } @Override protected String doInBackground(String... params) { HashMap<String, String> data = new HashMap<String,String>(); data.put(Config.KEY_USER_NAME,name); data.put(Config.KEY_WEATHER,weather); data.put(Config.KEY_DATE,date2); data.put(Config.KEY_STATUS,status); data.put(Config.KEY_TIMEIN,timeIn); data.put(Config.KEY_TIMEOUT,timeOut); RequestHandler rh=new RequestHandler(); String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); return result; } } AddInfo ru = new AddInfo(); ru.execute(name,weather,date2,status,timeIn,timeOut); } 

还有另一种使用callback的方法。 实现一个接口,完成AsyncTask之后,可以发送callback来完成另一项工作。

我相信这个问题来自这个问题

 return 0; 

您的addInformation方法每次返回值为0的长整型。 如果你想要它返回一些其他的号码,你将需要改变这一行。

编辑:为了跟踪你的行,添加另一个参数到你的方法头

 public long addInformation(int rowId, final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 

在第一个表中插入的行之后,可以使用lastInsertId()函数,也就是(Information)将lastInsertId()的值存储在某个variables中,然后在下一个表中插入行时使用该variables。 那就是(WorkForce)

由于AsyncTask是一个asynchronous任务,所以return 0; 在你的addInformation方法中总是先行,这就是为什么你得到0而不是“插入的行数”

你应该更新你的代码如下,请关注我的评论// MOVE addWorkForce HERE

 public void addInformation( final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) { class AddInfo extends AsyncTask<String, Void, String> { ProgressDialog loading; @Override protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); loading.dismiss(); Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); addWorkForce(Sub, NoP, NoH, Long.parseLong(s)); // MOVE addWorkForce HERE } @Override protected String doInBackground(String... params) { HashMap<String, String> data = new HashMap<String,String>(); data.put(Config.KEY_USER_NAME,name); data.put(Config.KEY_WEATHER,weather); data.put(Config.KEY_DATE,date2); data.put(Config.KEY_STATUS,status); data.put(Config.KEY_TIMEIN,timeIn); data.put(Config.KEY_TIMEOUT,timeOut); RequestHandler rh=new RequestHandler(); String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); return result; } } AddInfo ru = new AddInfo(); ru.execute(name,weather,date2,status,timeIn,timeOut); } 

那么,你只需要打电话

addInformation(name,weather,date2,status,first1[1],last1[1]);

当然,确保Sub, NoP, NoHvariables可以在AddInfo类中访问。

希望能帮助到你!