2017-04-19 1 views
0

나는 텍스트보기와 세 개의 이미지 버튼이있는 목록보기가 있습니다. 이미지 단추 중 하나를 클릭하면 주 페이지에서 메서드를 호출하려고합니다.안드로이드의 다른 클래스에서 mainactivity에서 호출 메서드

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) 

내가이 줄을 이동하려고 : :하지만이 오류가있어에서 onCreate에

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

를(); 그리고 나서 효과가 있었지만, 저는 play 메서드로 얻은 문자열에 따라 다른 오디오를 재생하고 싶습니다. 어떻게 해결할 수 있을까요?

내 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(); 
} 
} 

내 목록 어댑터 : 당신은 어댑터에서 외부 클래스를 참조 할 수 있어야합니다

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; 
} 
} 

답변

1

CustomAdapter에서 현재 Main3Activity 인스턴스를 사용자 지정 어댑터의 인수로 전달하는 대신 Main3Activity의 새 인스턴스를 만듭니다. 따라서 Main3Activity 메서드에 액세스하려고 할 때 null 포인터 예외가 발생합니다. CustomAdapter로 활동 인스턴스을 통과하여 Main3Activity.class에 다시, 그리고

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")); 
    } 

:

@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

Worked! 많은 감사 :) –

0

.

어댑터가 Activity 클래스 내에 정의되어 있다고 가정합니다. 그러면 접두사가없는 메서드를 직접 호출하면됩니다.

또는 명확성을 위해, 당신은 사용할 수 있습니다

Main3Activity.this.play(xxxx) 

을 OnClickListener를 내부.

0

를 어댑터에 문제가 인수로 Main3Activity을 허용하도록 CustomAdapter 생성자를 수정 해결하기

클래스를 사용하여 Main3Activity의 새 인스턴스를 만들고 있는데,이 인스턴스가 NullPointerException을 얻는 이유입니다. 당신이해야 할 일은 아래와 같습니다.

어댑터 클래스 내에 인터페이스를 생성하십시오.

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

는 다음과 같은 활동 클래스에서이 인터페이스에 대한

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

사용이 인터페이스를 세터를 만듭니다.

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); 

       } 



      } 
     }); 
관련 문제