2010-10-11 2 views
5

Tôi đã tạo một lớp tùy chỉnh cho dự án Android của tôi được gọi là "Âm thanh" Tôi muốn có thể gọi nó từ hoạt động của mình. Nội dung của lớp học của tôi như sau:Nhập lớp tùy chỉnh của tôi và gọi phương thức của nó?

package com.mypackage; 

import java.util.HashMap; 

import android.content.Context; 
import android.media.SoundPool; 

public class Sounds { 

private static boolean sound = true; 

private static final int FLIP_SOUND = 1; 

private static Context context; 
private static SoundPool soundPool; 
private static HashMap<Integer, Integer> soundPoolMap; 

public static void initSounds() { 
    soundPoolMap.put(FLIP_SOUND, soundPool.load(context, R.raw.flip, 1)); 
} 

public static void playFlip() { 
     soundPool.play(soundPoolMap.get(FLIP_SOUND), 1, 1, 1, 0, 1); 
} 

public static void setSound(Boolean onOff) { 
    sound = onOff; 
} 
} 

Trong lớp học chính của tôi Tôi đã cố gắng nhập lớp, tạo một thể hiện của nó nhưng tôi đoán tôi không hiểu làm thế nào nó được thực hiện. Ai có thể chỉ cho tôi đi đúng hướng được không?

+0

tôi như thế nào mọi thứ thay đổi trong vài năm ngắn ngủi. Có vẻ như câu hỏi này vẫn còn phổ biến và mọi người đang gặp phải các vấn đề tương tự, các nhà phát triển Android mới mà tôi tưởng tượng, như lúc đó. Tôi đang nhìn vào điều này tự hỏi làm thế nào tôi đã bao giờ mong đợi nó để làm việc. Điều rõ ràng trong đoạn mã trên là ngữ cảnh không bao giờ được khởi tạo (cũng không phải là bất kỳ trường nào trong thực tế), lớp hoặc yêu cầu một hàm tạo (và các trường không tĩnh) hoặc các tham số cần thiết (chẳng hạn như ngữ cảnh, soundpool và soundPoolMap) bạn thấy ở đây được truyền trực tiếp đến các phương thức tĩnh. Nếu không, chúng sẽ luôn là rỗng. – Hamid

Trả lời

9

được sửa đổi: Từ lớp Activity của bạn:

private Sounds s; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
     s = new Sounds(this); 
     s.initSounds(); 
} 

Bạn cũng có thể gửi các bối cảnh với các nhà xây dựng để lớp tùy chỉnh của bạn.

Hủy bỏ các biến tĩnh và phương pháp:

public class Sounds { 

private boolean sound = true; 

private int FLIP_SOUND = 1; 

private Context context; 
private SoundPool soundPool; 
private HashMap soundPoolMap; 

public Sounds(Context context){ 
    this.context = context; 
    soundPoolMap = new HashMap(); 
    soundPool = new SoundPool(0, AudioManager.STREAM_MUSIC, 0); 
} 

public void initSounds() { 
    soundPoolMap.put(FLIP_SOUND, soundPool.load(context, R.raw.flip, 1)); 
} 

public void playFlip() { 
    soundPool.play(soundPoolMap.get(FLIP_SOUND), 1, 1, 1, 0, 1); 
} 

public void setSound(Boolean onOff) { 
    sound = onOff; 
} 
} 
+0

Tôi đã thử tất cả mọi thứ được chỉ định ở đây với phương sách cuối cùng của tôi là "tĩnh" là nguyên nhân, sau khi đề xuất lên trên tôi đã xóa chúng ở nơi đã nói và chương trình vẫn bị hủy bỏ ngay sau khi hoạt động tìm cách gọi s.initSounds() ; Tôi cho rằng vấn đề là bối cảnh, vì nó đã cho tôi những vấn đề trước đây. Bạn có thể đề xuất cách tôi nên chuyển ngữ cảnh một cách chính xác không? – Hamid

+0

@Hamid: Tôi đã chỉnh sửa câu trả lời của mình. – Wroclai

+0

Cảm ơn, tôi đã làm điều này nhưng chương trình vẫn bị hủy khi tôi gọi initSounds(); Nếu tôi nhận xét điều này thì nó hoạt động tốt. Tôi không chắc liệu nó có liên quan hay không, nhưng hoạt động mà tôi đang làm việc được gọi từ hoạt động trước đó (cha mẹ?) Bằng một mục đích ... – Hamid

1

Hãy thử

Sounds s = new Sounds(); 
s.initSounds(); 
s.playFlip(); 
s.setSound(true); 
1

Bạn đã thực hiện tất cả các phương thức của lớp tĩnh. Nếu bạn muốn sử dụng chúng, hãy gọi cho chúng với Sounds.initSound() và cứ tiếp tục như vậy. Tuy nhiên, vì bạn có các biến lớp, các phương thức tĩnh và các biến không phù hợp. Xóa static khỏi các thành viên của bạn (trừ FLIP_SOUND) và sau đó thử tạo một thể hiện của lớp và các phương thức gọi như bình thường.

2

Tôi cũng gặp sự cố về cách sử dụng lớp học đặc biệt này. Tôi là một newbie trong Android và thậm chí trong việc sử dụng các lớp học và tôi đang nghiên cứu WebInterface.

Giải pháp của Shane Oliver làm việc cho tôi bằng cách sử dụng các biến lớp tiêu chuẩn.

Trong lớp Hoạt động:

Private JavaScriptInterface myJavaScriptInterface; 
myJavaScriptInterface.Toastshow("Hi EveryOne"); 

hoặc thậm chí:

JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this); 

Đối với JavaScriptInterface lớp:

public class JavaScriptInterface { 

    Context myContext; 

    //Instanciar o interface e definir o conteudo 
    JavaScriptInterface(Context c) { 
     myContext = c; 
    } 


    public void Toastshow(String toast_msg) 
    { 


     Toast.makeText(myContext, toast_msg, Toast.LENGTH_LONG).show(); 
    } 
} 

Hope this helps ...