"字段可以转换为局部变量"消息,然后无法识别变量



我收到这条消息,'字段可以转换为局部变量'。对它做了一些研究,发现了这个很好的帖子:这里

我收到消息的变量是这些,直接声明在以下之后:

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()之前声明变量,因为你没有上下文。

相关内容

最新更新