我收到这条消息,'字段可以转换为局部变量'。对它做了一些研究,发现了这个很好的帖子:这里
我收到消息的变量是这些,直接声明在以下之后:
public class MainActivity extends Activity {
final ListView listview;
final String callType;
final String phoneNumber;
final String callDate;
final String callDuration;
final Date callDateTime;
所以我接受了它的建议,把我的代码写成这样:
package com.example.chris.sunil_gupta;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.widget.ListView;
public class MainActivity extends Activity {
private List <CallData>list = new ArrayList<CallData>();
private Context context=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
final ListView listview;
final String callType;
final String phoneNumber;
final String callDate;
final String callDuration;
final Date callDateTime;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
listview=(ListView)findViewById(R.id.ListView_CallData);
getCallDetails();
CustomAdapter adapter = new CustomAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
}
public void getCallDetails()
{
@SuppressWarnings("deprecation")
Cursor managedCursor = managedQuery( CallLog.Calls.CONTENT_URI,null, null,null, null);
int number = managedCursor.getColumnIndex( CallLog.Calls.NUMBER );
int type = managedCursor.getColumnIndex( CallLog.Calls.TYPE );
int date = managedCursor.getColumnIndex( CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex( CallLog.Calls.DURATION);
while (managedCursor.moveToNext())
{
phoneNumber = managedCursor.getString(number);
callType = managedCursor.getString(type);
callDate = managedCursor.getString(date);
callDateTime = new Date(Long.valueOf(callDate));
callDuration = managedCursor.getString(duration);
String cType = null;
int cTypeCode = Integer.parseInt(callType);
switch(cTypeCode)
{
case CallLog.Calls.OUTGOING_TYPE:
cType = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
cType= "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
cType = "MISSED";
break;
}
CallData calldata=new CallData(cType, phoneNumber, callDateTime, callDuration);
list.add(calldata);
}
managedCursor.close();
}
}
现在callType,phoneNumber,callDate,callDuration,callDateTime以红色显示,当我尝试编译我的项目时,我收到错误 - 非法开始表达式。
谁能告诉我出了什么问题以及如何解决这个问题?
您现在收到错误,因为您用错误的方法声明了变量。将声明从onCreate移动到使用它们的getCallDetails中。
因为你的变量是最终的。不能将任何值重新分配给最终变量。删除关键字 final,然后重试。让我知道它是否有效。祝你好运。
只需删除final
修饰符即可。
当应用于实例变量时,最后一个修饰符仅表示无法更改实例变量。
在您的示例中,您声明了最终变量,但没有为它们设置任何值。这就是您问题的原因。
此外,您还应该在使用变量的方法中声明变量。因此,代码的某些部分应如下所示:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
final ListView listview = (ListView) findViewById(R.id.ListView_CallData);
// ...
}
public void getCallDetails() {
// ...
while (managedCursor.moveToNext()) {
final String phoneNumber = managedCursor.getString(number);
final String callType = managedCursor.getString(type);
final String callDate = managedCursor.getString(date);
final Date callDateTime = new Date(Long.valueOf(callDate));
final String callDuration = managedCursor.getString(duration);
// ...
}
它是最终的,请将其设置为static
我认为你不能在调用super.onCreate()之前声明变量,因为你没有上下文。