2010-02-07 44 views
5

Tôi đang gặp một số sự cố với lỗi "Không thể thực hiện tham chiếu tĩnh" trong chương trình Android của tôi. Tôi đang tạo ra một trò chơi rơi cát (tương tự như trò chơi bột) và tôi tạo ra một lớp được gọi là điều khiển để tạo thanh điều khiển ở cuối màn hình với thanh trượt cho kích thước bàn chải (hoạt động tốt) và một nút để bật lên Hộp thoại cho phép người dùng chọn phần tử đã chọn. Tuy nhiên, khi tôi gọi DemoActivity.showDialog (2) từ mã của tôi, nó cung cấp tham chiếu tĩnh đến lỗi không tĩnh (DemoActivity là hoạt động chính của ứng dụng của tôi). Tôi cũng đã cố gắng thay đổi nó để chỉ Activity.showDialog (2), nhưng tôi đã nhận chính xác cùng một lỗi! Xin vui lòng giúp đỡ, tôi đang làm gì sai? Dưới đây là mã và nhờ tôi trước:"Không thể thực hiện tham chiếu tĩnh đối với phương pháp không tĩnh" trong Android

package sand.falling.opengl; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.SeekBar; 

public class Control extends LinearLayout 
{ 
    private ImageButton control_button; 
    private SeekBar brush_size_slider; 

    final CharSequence[] elementslist = {"Sand", "Water", "Plant", "Wall", "Fire", "Ice", "Generator", "Oil", "Magma", "Stone", "C4"}; 

    public Control(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    @Override 
    protected void onFinishInflate() 
    { 
     control_button = (ImageButton) findViewById(R.id.element_picker_button); 
     brush_size_slider = (SeekBar) findViewById(R.id.brush_size_slider); 

     control_button.setOnClickListener 
      (
        new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          //THIS DOESN'T WORK!!!! 
          DemoActivity.showDialog(2); //Run the element picker dialog 
         } 
        } 
      ); 
     control_button.setImageResource(R.drawable.palette); 

     brush_size_slider.setOnSeekBarChangeListener 
      (
        new SeekBar.OnSeekBarChangeListener() 
        { 
         public void onProgressChanged(SeekBar seekbar, int progress, boolean fromTouch) 
         { 
          int p = 32 * progress/100; 
          DemoActivity.setBrushSize(p); 
          Log.v("DemoActivity", "size:" + p); 
         } 
         public void onStartTrackingTouch(SeekBar seekbar) {} 
         public void onStopTrackingTouch(SeekBar seekbar) {} 
        } 
      ); 
     brush_size_slider.setProgress((int)400/32); 
    } 
} 

EDIT: Tôi cố định nó bằng cách thêm những điều sau để mã Control.java tôi:

public class Control extends LinearLayout 
{ 
    private DemoActivity activity; 
     ... 
    public void setActivity(DemoActivity act) 
    { 
     activity = act; 
    } 
     ... 
     //Set a click listener for the button which should pop up element picker dialog when clicked 
     control_button.setOnClickListener 
      (
        new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          activity.showDialog(2); //Run the element picker dialog 
         } 
        } 
      ); 
} 

Và sau đó gọi control.setActivity(this); từ phần onResume của tôi về DemoActivity.java ! Hy vọng nó sẽ giúp những người bạn với các vấn đề tương tự !!

Trả lời

12

Bạn phải gọi showDialog trên cá thể DemoActivity, KHÔNG phải trên chính lớp đó. Lần duy nhất bạn có thể gọi ClassName.methodName() là nếu phương thức được định nghĩa là tĩnh. showDialog không phải là phương pháp tĩnh.

Để khắc phục điều này, bạn cần phải tạo nhanh DemoActivity hoặc lấy số hiện có, sau đó gọi showDialog trên đó.

Edit: Nếu bạn đã có một trường hợp DemoActivity khi bạn khởi tạo đối tượng Control này, có lẽ việc sửa đổi sau đây sẽ làm việc:

public class Control extends LinearLayout 
{ 

    ... 

    // add an Activity instance 
    private Activity activity; 

    // set the Activity in your constructor 
    public Control(Context context, AttributeSet attrs, Activity activity) 
    { 
     super(context, attrs); 
     this.activity = activity; 
    } 

    @Override 
    protected void onFinishInflate() 
    { 
     ... 

      // Use the instance activity here 
      activity.showDialog(2); 
     ... 
    } 
} 
+0

Ah, tôi nghĩ mình hiểu rồi. Làm thế nào tôi sẽ đi về nhận được một tham chiếu đến một trường hợp cụ thể của lớp DemoActvity. AFAIK, tôi không tự tạo một bản thân, Android tự động thực hiện khi người dùng chạy ứng dụng của tôi, vậy làm thế nào để tôi tham khảo nó? Cảm ơn câu trả lời nhanh btw! – gkanwar

+1

Hmm, không chắc chắn, tôi chưa thực hiện bất kỳ sự phát triển Android nào. Tôi sẽ xem tài liệu DemoActivity. DemoActivity có phương thức 'instance()' hay 'getInstance()' không? Nếu vậy, đó có thể là những gì bạn cần. –

+0

Vâng, DemoActivity là một lớp mà tôi đã tạo mở rộng lớp Hoạt động chung chứa trong mã Android cơ bản. Tôi đã tìm tài liệu cho Activity trong Android, và có một hàm gọi là getInstanceCount(), nhưng không có gì giống như instance() hoặc getInstance(). – gkanwar

0

nếu Create được gọi bởi ANDROID, do đó bạn không tạo ví dụ, chỉ cần đặt vào các ký tự tạo mShowDialog=this hoặc mShowDialog=pShowDialog

nói cách khác - hãy tạo giá trị thể hiện cũng bạn có thể thêm công khai để nhận giá trị đó. Sau đó, bạn có thể truy cập chức năng cá thể thông qua phần tóm tắt bằng cách xen vào bộ thu thập:

ABSTRACTCLASS.getInstance().applyFunction(); 
Các vấn đề liên quan