2016-02-12 36 views
0

我得到這個消息'字段可以轉換爲局部變量'。做了一些關於它的研究,發現這個好職位:here'字段可以被轉換爲本地變量'消息,然後變量不被識別

變量我正在用的這些消息宣佈後直:

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都上來了紅色和我得到的錯誤 - 表達的非法啓動 - 當我嘗試編譯我的項目。

任何人都可以告訴我什麼是錯的,以及如何解決這個問題?

+3

你需要在使用它們的方法中聲明你的變量(getCallDetails)。 – Eborbob

+0

將此作爲答案,我將其標記爲正確。 – CHarris

回答

1

由於您以錯誤的方法聲明變量,您現在正在收到錯誤。將聲明從onCreate移到使用getCallDetails的地方。

1

只要刪除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); 
    // ... 
} 
+0

感謝德米特里,我認爲不要聲明我的變量'最終'更有意義,正如你所說的,但是最終與否,錯誤仍在發生。我認爲這個問題並沒有在正確的方法中聲明變量。 +1雖然。 – CHarris

+0

@ChristopheHarris。在你的方法中,你可以聲明變量最後只是爲了表明你不會重新賦值。這只是爲了閱讀。 – dmitriyzaitsev

1

因爲你的變量是最終的。您不能爲最終變量重新分配任何值。刪除關鍵字final並再次嘗試。讓我知道它是否有效。祝你好運。

+0

乾杯,但它看起來特別是這個問題沒有在正確的方法中聲明變量。 – CHarris

-3

我不認爲你可以在調用super.onCreate()之前聲明變量,因爲你沒有上下文。

+0

這是不正確 – barry

+0

沒有。我們可以在調用'onCreate()'之前聲明。 –

0

如果你想要它是最終的,那麼使它成爲靜態