2016-02-04 21 views
8

Tôi nhận được thông báo lỗi này nói rằng Variable "snackbar" might not have been initialized.Biến 'thanh snack' có thể chưa được khởi tạo

Sau đây là một phần của MainActivity.java mã của tôi:

public class NetworkChangeReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 

    if (info != null && info.isConnected()) { 
     final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "WiFi change detected; updating information...", Snackbar.LENGTH_LONG) 
      .setAction("DISMISS", new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        snackbar.dismiss(); 
       } 
      }); 
      snackbar.setActionTextColor(Color.BLUE); 
      snackbar.show(); 

      getWifi(); 
    } 
} 
} 

tôi đã đọc chấp nhận Stack Overflow câu trả lời here và nó gợi ý rằng tôi khởi snackbar ngay sau khi public class NetworkChangeReceiver extends BroadcastReceiver. Vì vậy, tôi đã thay đổi mã để:

/* no changes here */ 
@Override 
public void onReceive(Context context, Intent intent) { 
    Snackbar snackbar = null; 

    /* no changes here */ 
    if (...) { 
     snackbar = Snackbar.make(...); 
    } 

    /* no changes here */ 
} 

Nhưng điều này mang lại cho tôi một lỗi Variable "snackbar" is accessed from within inner class, needs to be declared final và cảnh báo Method invocation "snackbar.dismiss()" may produce "java.lang.NullPointerException".

Bất kỳ đề xuất nào về cách giải quyết vấn đề này? Cảm ơn!

Trả lời

8

Phân ra phương pháp xiềng xích của bạn gọi:

final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "WiFi change detected; updating information...", Snackbar.LENGTH_LONG); 
snackbar.setAction("DISMISS", new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     snackbar.dismiss(); 
    } 
    }); 

Bằng cách này, chắc chắn snackbar được gán trước khi bạn tạo ra các OnClickListener.

+0

Chỉ cần tò mò, đây là một lỗi trong Android studio hay tôi có nghĩa là để mã nó theo cách bạn đã đề xuất? –

+0

Đây không phải là lỗi. Đó là vì cách thức các lớp ẩn danh được triển khai thực sự, điều này thực sự khá rõ ràng khi bạn vuốt xung quanh một chút. Tôi đã thực sự viết một lời giải thích chi tiết ... sẽ tiếp tục và đăng một liên kết ở đây. –

+0

Cảm ơn @Andy Turner, mong được đọc bài viết của bạn :) –

-5

Là một workaround để

Variable "snackbar" is accessed from within inner class, needs to be declared final

bạn có thể làm biến mảng một yếu tố cuối cùng

+6

Đó là thiết kế khủng khiếp để có được điều này để làm việc. –

+0

Vâng, nhưng nếu bạn thực sự biết bạn đang làm gì, nó có thể hoạt động. Nhưng, yeah, bạn không nên làm điều đó. – Meegoo

+1

Thậm chí nếu bạn thực sự biết những gì bạn đang làm, nó vẫn là mã khủng khiếp. –

Các vấn đề liên quan