2017-04-19 5 views
0

Ich habe eine Listenansicht mit Textansicht und drei Bildschaltflächen. Ich versuche eine Methode von der Hauptseite aus aufzurufen, wenn auf eine der Bildschaltflächen geklickt wird. Aber ich habe diesen Fehler:Aufruf Methode in Mainactivity aus einer anderen Klasse in Android

04-19 13:02:48.021 30996-30996/com.example.lama.audiotest E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.example.lama.audiotest, PID: 30996 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
                      at android.content.ContextWrapper.getResources(ContextWrapper.java:92) 
                      at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81) 
                      at android.media.MediaPlayer.create(MediaPlayer.java:1007) 
                      at android.media.MediaPlayer.create(MediaPlayer.java:990) 
                      at com.example.lama.audiotest.Main3Activity.play(Main3Activity.java:35) 
                      at com.example.lama.audiotest.CustomAdapter$1.onClick(CustomAdapter.java:83) 
                      at android.view.View.performClick(View.java:5697) 
                      at android.view.View$PerformClick.run(View.java:22526) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7229) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Ich habe versucht, diese Zeile bewegt:

mp= MediaPlayer.create(Main3Activity.this,R.raw.alfatiha); 

zum onCreate(); und dann hat es geklappt, aber ich möchte je nach der Saite, die ich mit der Play-Methode bekommen habe, ein anderes Audio spielen. Wie löst man das?

mein mainactivity:

public class Main3Activity extends Activity { 

private static final String TAG = Main3Activity.class.getSimpleName(); 
static MediaPlayer mp; 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main3); 

    ListView listView = (ListView) findViewById(R.id.list_data); 

    CustomAdapter customAdapter = new CustomAdapter(); 

    listView.setAdapter(customAdapter); 

} 

public void play(String name){ 
    if (name.equals("الفاتحه")){ 
     mp= MediaPlayer.create(Main3Activity.this,R.raw.alfatiha); 
     mp.start(); 
    } 
} 

public void pause(){ 
     mp.pause(); 
} 

public void stop(){ 
    mp.stop(); 
} 
} 

meiner Liste Adapter:

public class CustomAdapter extends BaseAdapter { 
Main3Activity main= new Main3Activity(); 
private static final String TAG = CustomAdapter.class.getSimpleName(); 
ArrayList<DataModel> listArray; 

public CustomAdapter() { 
    listArray = new ArrayList<DataModel>(5); 
    listArray.add(new DataModel("الفاتحه", 5, 1.8, "Java")); 
    listArray.add(new DataModel("البقرة", 10, 2.8, "Python")); 
    listArray.add(new DataModel("ال عمران", 15, 3.8, "Django")); 

} 

@Override 
public int getCount() { 
    return listArray.size(); // total number of elements in the list 
} 

@Override 
public Object getItem(int i) { 
    return listArray.get(i); // single item in the list 
} 

@Override 
public long getItemId(int i) { 
    return i;     // index number 
} 

@Override 
public View getView(int index, View view, final ViewGroup parent) { 

    if (view == null) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     view = inflater.inflate(R.layout.list, parent, false); 
    } 

    final MediaPlayer mp; 


    final DataModel dataModel = listArray.get(index); 

    TextView textView = (TextView) view.findViewById(R.id.Itemname); 
    textView.setText(dataModel.getName()); 

    ImageButton play = (ImageButton) view.findViewById(R.id.btnplay); 
    ImageButton pause = (ImageButton) view.findViewById(R.id.btnpause); 
    ImageButton stop = (ImageButton) view.findViewById(R.id.btnstop); 

    play.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 


      main.play(dataModel.getName()); 
      // Toast.makeText(parent.getContext(), "you clicked play for: " + dataModel.getName(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    pause.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      main.pause(); 

      // Toast.makeText(parent.getContext(), "you clicked pause for: " + dataModel.getName(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    stop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      main.stop(); 
      // Toast.makeText(parent.getContext(), "you clicked stop for: " + dataModel.getName(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 



    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Log.d(TAG, "string: " + dataModel.getName()); 
      Log.d(TAG, "int: " + dataModel.getAnInt()); 
      Log.d(TAG, "double: " + dataModel.getaDouble()); 
      Log.d(TAG, "otherData: " + dataModel.getOtherData()); 

      Toast.makeText(parent.getContext(), "view clicked: " + dataModel.getOtherData(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    return view; 
} 
} 

Antwort

1

In Ihrem CustomAdapter erstellen Sie eine neue Instanz von Main3Activity, anstatt Ihre aktuelle Main3Activity-Instanz als Argument für Ihren benutzerdefinierten Adapter zu übergeben. Aus diesem Grund erhalten Sie eine Nullzeiger-Ausnahme, wenn Sie versuchen, auf Main3Activity-Methoden zuzugreifen.

public class CustomAdapter extends BaseAdapter { 
    Main3Activity main; 
    private static final String TAG = CustomAdapter.class.getSimpleName(); 
    ArrayList<DataModel> listArray; 

    public CustomAdapter(Main3Activity main) { 
     this.main = main; 
     listArray = new ArrayList<DataModel>(5); 
     listArray.add(new DataModel("الفاتحه", 5, 1.8, "Java")); 
     listArray.add(new DataModel("البقرة", 10, 2.8, "Python")); 
     listArray.add(new DataModel("ال عمران", 15, 3.8, "Django")); 
    } 

Dann zurück in Ihre Main3Activity.class, übergeben Aktivitätsinstanz zu CustomAdapter:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main3); 
    ListView listView = (ListView) findViewById(R.id.list_data); 
    CustomAdapter customAdapter = new CustomAdapter(this); 
    listView.setAdapter(customAdapter); 
} 
+0

Gearbeitet! Danke vielmals :) –

0

Sie benötigen die äußere Klasse aus dem Adapter verweisen zu können.

Ich nehme an, dass der Adapter in der Activity-Klasse definiert ist. Dann alles, was Sie tun müssen, ist die Methode direkt ohne Präfix aufrufen und es wird es finden.

Alternativ zur Klarheit, können Sie verwenden:

Main3Activity.this.play(xxxx) 

innerhalb des OnClickListener.

0

In Ihrem Adapter Main3Activity als Argument ermöglichen

Um Ihr Problem zu ändern, um Ihre CustomAdapter Konstruktor zu lösen Klasse erstellen Sie eine neue Instanz von Main3Activity, die eine andere Instanz ist, weshalb Sie NullPointerException erhalten. Alles, was Sie tun müssen, ist unten angegeben.

Erstellen Sie eine Schnittstelle innerhalb Ihrer Adapterklasse.

public interface ItemActionListener{ 
     void onpause(DataModel model); 
     void onStop(DataModel model); 
     void onPlay(DataModel model); 
    } 
private ItemActionListener onItemActionlListener; 

erstellen Setter für diese Schnittstelle

public void setOnItemActionlListener(ItemActionListener onItemActionlListener) { 
      this.onItemActionlListener = onItemActionlListener; 
     } 

Verwenden Sie diese Schnittstelle in Ihrer Aktivitätsklasse wie unten.

CustomAdapter customAdapter = new CustomAdapter(); 
    customAdapter.setOnItemActionlListener(onItemActionListener); 
    listView.setAdapter(customAdapter); 


private CustomAdapter .ItemActionListener onItemActionListener=new CustomAdapter .ItemActionListener() { 


     @Override 
     public void onpause(DataModel model) { 
      //Call your pause() method written in activity class 
      pause(); 

     } 

     @Override 
     public void onStop(DataModel model) { 
      //Call your stop() method written in activity class 
      stop(); 
     } 

     @Override 
     public void onPlay(DataModel model) { 
    //Call your play() method written in activity class 
      play(); 
     } 
    }; 




In your adapter class 

pause.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if(onItemActionlListener !=null){ 
       onItemActionlListener.onpause(dataModel); 

       } 



      } 
     }); 
Verwandte Themen