많은 분들의 도움 부탁 드립니다.
메인에서 버튼입력으로 팝업 띄운후 버튼이벤트 받아서 처리하는것은 잘 되는데
리스트뷰 선택하면 팝업창 띄우고 팝업창에서 데이터 입력받아서 리스트뷰의 값을 변경하려고 합니다.
하지만 현재 팝업창의 edittext와 button은 등록을 했는데 버튼 이벤트 처리하려고 하면 에러가 발생합니다.
그리고 데이터 받은후에 커스텀 리스트뷰의 price 값을 변경하려고하는데 이 text에 접근하는 방법좀 알려주세요~
소스코드
package ac.kr.miribogi;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class Shopping extends Activity {
ArrayList<ListPrice> listItem;
ArrayList<String> List;
TextView edt_sum;
TextView edt_budget;
TextView edt_diff;
Button btn_popup;
EditText edt_popup;
PopupWindow popup;
View popupview;
LinearLayout linear;
int budget;
String ItemPrice;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shopping);
List = new ArrayList<String>();
edt_sum = (TextView) findViewById(R.id.textView4);
edt_budget = (TextView) findViewById(R.id.textView6);
edt_diff = (TextView) findViewById(R.id.textView8);
Intent intent = getIntent();
List = intent.getStringArrayListExtra("lists");
budget = intent.getExtras().getInt("budget");
edt_budget.setText(Integer.toString(budget));
edt_diff.setText("-"+Integer.toString(budget));
// string to array
String[] arr = new String[List.size()];
arr = (String[])List.toArray(arr);
// array generate
listItem = new ArrayList<ListPrice>();
for(int i=0;i<List.size();i++) {
ListPrice t1 = new ListPrice(arr[i],"0");
listItem.add(t1);
}
MyAdapter m_adapter = new MyAdapter(this, R.layout.shoppinglist,listItem);
ListView MyList;
MyList =(ListView)findViewById(R.id.id_listView);
MyList.setAdapter(m_adapter);
MyList.setOnItemClickListener(mItemClickListener);
//*** listView setting
MyList.setChoiceMode(ListView.CHOICE_MODE_NONE);
MyList.setDivider(new ColorDrawable(Color.BLUE));
MyList.setDividerHeight(2);
// popup window setup
linear = (LinearLayout)findViewById(R.id.shoppinglayout);
popupview = View.inflate(this, R.layout.shoppopup, null);
popup = new PopupWindow(popupview,400,150,true);
}//oncreate
//itemclicklistener
private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long l_position) {
Toast.makeText(Shopping.this, "click", Toast.LENGTH_SHORT).show();
popup.showAtLocation(linear, Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM, 0, 20);
popup.setAnimationStyle(-1);
edt_popup = (EditText) findViewById(R.id.input_pop);
btn_popup = (Button) findViewById(R.id.price_pop);
이부분을 추가하면 에러가 발생합니다.
/* btn_popup.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
popup.dismiss();
}
});
*/ }
};
}//Activity
// listview print list
class ListPrice {
public ListPrice(String _ListName, String _Price) {
this.ListName = _ListName;
this.Price = _Price;
}
private String ListName;
private String Price;
public String getList() {
return ListName;
}
public String getPrice() {
return Price;
}
}
//Custom Adapter
class MyAdapter extends BaseAdapter {
Context maincon;
LayoutInflater Inflater;
ArrayList<ListPrice> arSrc;
int layout;
public MyAdapter(Context context,int alayout,ArrayList<ListPrice> aarSrc) {
maincon = context;
Inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
arSrc = aarSrc;
layout = alayout;
}
public int getCount() {
return arSrc.size();
}
public String getItem(int position) {
return arSrc.get(position).getList();
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent){
if (convertView == null){
convertView = Inflater.inflate(layout, parent,false);
}
TextView lt = (TextView) convertView.findViewById(R.id.listName);
if (lt != null) {
lt.setText(arSrc.get(position).getList());
}
TextView pt = (TextView) convertView.findViewById(R.id.listPrice);
if (pt != null) {
pt.setText(arSrc.get(position).getPrice());
}
return convertView;
}
}
많은 고수분들 부탁드려요~~
팝업의 버튼이벤트를 받기위한 빨간 부분을 추가하면 강제 종료가 되고, 그 부분을 안넣으면 팝업창은 뜹니다.
혹시몰라서 LogCat도 첨부합니다.
11-29 08:35:47.676: E/AndroidRuntime(617): FATAL EXCEPTION: main
11-29 08:35:47.676: E/AndroidRuntime(617): java.lang.NullPointerException
11-29 08:35:47.676: E/AndroidRuntime(617): at ac.kr.miribogi.Shopping$1.onItemClick(Shopping.java:103)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.widget.AbsListView$1.run(AbsListView.java:3529)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.os.Handler.handleCallback(Handler.java:615)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.os.Handler.dispatchMessage(Handler.java:92)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.os.Looper.loop(Looper.java:137)
11-29 08:35:47.676: E/AndroidRuntime(617): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-29 08:35:47.676: E/AndroidRuntime(617): at java.lang.reflect.Method.invokeNative(Native Method)
11-29 08:35:47.676: E/AndroidRuntime(617): at java.lang.reflect.Method.invoke(Method.java:511)
11-29 08:35:47.676: E/AndroidRuntime(617): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-29 08:35:47.676: E/AndroidRuntime(617): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-29 08:35:47.676: E/AndroidRuntime(617): at dalvik.system.NativeStart.main(Native Method)
findViewById 는 setContentView(layout_root) ...layout_root.xml 에서 검색하는거구요
밑에 edittext랑 button은 popupview안에 있는거니.. 아래처럼...
에러는.... Button 못찾겠음.. 입니다.
edt_popup = (EditText) popupview.findViewById(R.id.input_pop);
btn_popup = (Button) popupview.findViewById(R.id.price_pop);
이부분을 추가하면 에러가 발생합니다.
/* btn_popup.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
popup.dismiss();
}
});
*/ }
};
BornToTry 님 답변 감사합니다. 그부부는 저도 이해가 가서 popupview.find~ 이렇게 작성을 했었습니다. 하지만 똑같은 에러가 발생합니다.
너무 초보라서 어떻게 설명을 드려야할지....
우선 팝업 xml을 만드고 그것을 popupview에 연결해준후에 popupview에 있는 edt와 btn을 설정해줬는데 도무지 왜 에러인지.. 버튼은 떡하니
그 xml에 있습니다. ㅠㅠ
popupview.findviewbyid
해당 뷰에서 찾아야 합니다.
저렇게 하시면 전체 뷰인 setContentView하신데서 찾으니까 버튼을 못찾는 것입니다.
아 위에분이 똑같은 답변써주셨네요.
at ac.kr.miribogi.Shopping$1.onItemClick(Shopping.java:103)
103 라인에 널포인트인데 왜 널인지 확인하시고
onItemClick 인걸 보니 List item 클릭하자 마자 죽은거네요.
RedMask님 답변 감사합니다.
해당뷰에서 차아야 한다고 말씀해 주셨는데 해당 뷰라면 팝업 창을 말씀 하시는것 같은데 그럼 어디서 해야할까요?
왕초보라... 알려주시면 감사드리겠습니다.
activity는 setContentView()를 통해서 xml을 가져와서 뿌려주고
만드시 inflator를 이용해서 만드신 팝업은 setContentView에 있는 xml 이 아닌 독자적인 팝업 View 이잖아요.
팝업 View안에 버튼이 있는거 아닌가요? 그럼 그 버튼은 팝업View의 xml에 있는 id에서 찾아야 하므로
inflator를 통해서 얻은 View에서 찾아야 하죠. 그래서 popupview.findviewbyid 를 하라는 것입니다.
허나 그전에 제가 위에 적어드린 라인에서 nullpoint가 왜 났는지 부터 확인해봐야 할것같습니다. 그 라인이
버튼 click listener를 단 라인이 아니라면 말이죠.
무슨 에러인지를 써주셔야...