대화 상자에 검색 필드가 설정된 다음 사용자가 처음 열려면 클릭하면 제목 및 조회가 입력됩니다. Activity의 listview와 다시 통신 할 수 있기를 바랍니다.DialogFragment에서 Activity로 데이터를 다시 전달
불행히도 나는 검색을 시도 할 때 충돌이 계속 발생합니다. 나는 청취자를 사용하여 설정했지만 DialogFragment'a 레이아웃 xml에 있어도 MainActivity의 레이아웃에서 textView를 읽으려는 것과 관련이 있다고 생각한다.
MainActivity에서 R.id.searchField를 호출하여 onCreate의 setContent의 레이아웃 XML이 DialogFragment가 구현 한 것과 다릅니다. 그렇게하려고 할 때 아무런 오류가 없으며, 치명적인 충돌 만 있습니다.
MainActivity :
public class MainActivity extends Activity implements searchListener{
public void searchBooks()
{
// Error is in this function, believe it has to do with this textField as it resides in // the DialogFragment's xml? Unless findViewById calls from all XMLS and just not one defined in
//setContentView for the activity? Not sure though, initially I feel I should have this searchField
//defined in the fragment class, but then I won't have access to it in this function in MainActivity,
//or the mResults which is where the data is being used
EditText searchField = (EditText) findViewById(R.id.searchField);
if (mResults != null && !searchField.getText().equals(""))
{
String inputedText = searchField.getText().toString();
JSONArray results = new JSONArray();
for (int i = 0; i < mResults.length(); i++)
{
try {
JSONObject bookObject = mResults.getJSONObject(i);
if (bookObject.get("name").toString().equalsIgnoreCase(inputedText))
{
results.put(bookObject);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
public void showDialog() {
DialogFrag newFragment = DialogFrag.newInstance();
newFragment.show(getFragmentManager(), "dialog");
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Setting the main view
setContentView(R.layout.activity_main_fragment);
}
}
DialogFragment :
public class DialogFrag extends DialogFragment {
public static DialogFrag newInstance() {
return new DialogFrag();
}
private searchListener listener;
public interface searchListener
{
public void searchBooks();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (searchListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + "attaching d fragment failed!");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.search_dialog_fragment, container, false);
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.searchBooks();
}
});
return v;
}
}
스택 트레이스
01-29 20:10:21.570: E/AndroidRuntime(11260): FATAL EXCEPTION: main
01-29 20:10:21.570: E/AndroidRuntime(11260): Process: com.brentadams.bookList, PID: 11260
01-29 20:10:21.570: E/AndroidRuntime(11260): java.lang.NullPointerException
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.brentadams.bookList.MainActivity.searchBooks(MainActivity.java:327)
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.brentadams.bookList.fragments.SearchFragment$1.onClick(SearchFragment.java:48)
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.view.View.performClick(View.java:4438)
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.view.View$PerformClick.run(View.java:18422)
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.os.Handler.handleCallback(Handler.java:733)
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.os.Handler.dispatchMessage(Handler.java:95)
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.os.Looper.loop(Looper.java:136)
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.app.ActivityThread.main(ActivityThread.java:5017)
01-29 20:10:21.570: E/AndroidRuntime(11260): at java.lang.reflect.Method.invokeNative(Native Method)
01-29 20:10:21.570: E/AndroidRuntime(11260): at java.lang.reflect.Method.invoke(Method.java:515)
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-29 20:10:21.570: E/AndroidRuntime(11260): at dalvik.system.NativeStart.main(Native Method)
하지 내가 여기에서 오류가 발생하는 이유 다른 확인은 아래 코드와 스택 추적입니다
새 코드 편집/오류 :
당신의 충고를 받아서 string을 searchBooks 메서드에 다시 전달해 보았습니다. 그러나 지금 생각해 보면 어리석은 nullpointerexception을 받는다는 것은 의미가 없습니다. 텍스트 뷰 내 activity_main_fragment.xml에 있습니다 :
public class MainActivity extends Activity implements searchListener{
public void searchBooks(String searchString)
{
if (mResults != null && searchString != null && !searchString.equals(""))
{
JSONArray results = new JSONArray();
for (int i = 0; i < mResults.length(); i++)
{
try {
JSONObject bookObject = mResults.getJSONObject(i);
if (bookObject.get("name").toString().equalsIgnoreCase(searchString))
{
results.put(bookObject);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
public void showDialog() {
DialogFrag newFragment = DialogFrag.newInstance();
newFragment.show(getFragmentManager(), "dialog");
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Setting the main view
setContentView(R.layout.activity_main_fragment);
}
}
DialogFragment
public class DialogFrag extends DialogFragment {
public static DialogFrag newInstance() {
return new DialogFrag();
}
private searchListener listener;
public interface searchListener
{
public void searchBooks(String text);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (searchListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + "attaching d fragment failed!");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.search_dialog_fragment, container, false);
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText searchField = (EditText) v.findViewById(R.id.searchField);
String input = searchField.getText().toString();
listener.searchBooks(input);
}
});
return v;
}
}
스택 트레이스
01-29 15:30:31.402: E/AndroidRuntime(777): FATAL EXCEPTION: main
01-29 15:30:31.402: E/AndroidRuntime(777): java.lang.NullPointerException
01-29 15:30:31.402: E/AndroidRuntime(777): at com.brentadams.bookList.fragments.SearchFragment$1.onClick(SearchFragment.java:51)
01-29 15:30:31.402: E/AndroidRuntime(777): at android.view.View.performClick(View.java:4084)
01-29 15:30:31.402: E/AndroidRuntime(777): at android.view.View$PerformClick.run(View.java:16966)
01-29 15:30:31.402: E/AndroidRuntime(777): at android.os.Handler.handleCallback(Handler.java:615)
01-29 15:30:31.402: E/AndroidRuntime(777): at android.os.Handler.dispatchMessage(Handler.java:92)
01-29 15:30:31.402: E/AndroidRuntime(777): at android.os.Looper.loop(Looper.java:137)
01-29 15:30:31.402: E/AndroidRuntime(777): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-29 15:30:31.402: E/AndroidRuntime(777): at java.lang.reflect.Method.invokeNative(Native Method)
01-29 15:30:31.402: E/AndroidRuntime(777): at java.lang.reflect.Method.invoke(Method.java:511)
01-29 15:30:31.402: E/AndroidRuntime(777): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-29 15:30:31.402: E/AndroidRuntime(777): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-29 15:30:31.402: E/AndroidRuntime(777): at dalvik.system.NativeStart.main(Native Method)
행 51 :
String input = searchField.getText().toString();
스택 추적을 게시하십시오. – Raghunandan
시간을내어 주셔서 감사합니다. – user3117785
'MainActivity.java' 란 무엇입니까? – Raghunandan