首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据从DialogFragment传递回活动

将数据从DialogFragment传递回活动
EN

Stack Overflow用户
提问于 2014-01-29 19:35:56
回答 2查看 2.8K关注 0票数 0

我在对话框中设置了一个搜索字段,然后当用户单击开始打开时,允许他们输入一个标题并点击search。我希望它能够与活动的列表视图进行交流。

不幸的是,当我试图搜索的时候,我一直被撞毁。我已经使用侦听器设置了它,但是我相信它与尝试从MainActivity的布局中读取textView有关,即使它在DialogFragment中?

我试图通过R.id.searchField在MainActivity中调用它,其中onCreate的setContent的布局XML不同于DialogFragment实现的布局XML。当我试图这样做的时候没有错误,只有致命的崩溃。不知道为什么我会收到一个错误,下面是代码和堆栈跟踪:

MainActivity:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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;
    }
}

StackTrace

代码语言:javascript
运行
复制
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)

编辑新代码/错误:

接受了您的建议,将字符串传递回方法searchBooks,但是现在收到了一个愚蠢的空空异常,我认为这是没有任何意义的。textview驻留在我的activity_main_fragment.xml中:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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;
    }
}

斯塔克迹

代码语言:javascript
运行
复制
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行:

代码语言:javascript
运行
复制
        String input = searchField.getText().toString();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-29 19:49:35

所以是的,问题是R.id.searchfield。它不是MainActivity的根视图的子视图,它是对话框片段的子视图。

之所以会出现空指针,是因为它找不到R.id.searchfield,结果搜索字段是空的,在调用searchField.getText()时,这会使您在下一行崩溃。

只需让您的对话框框架搜索文本字段,并将一个字符串传回给您的主要活动。

票数 1
EN

Stack Overflow用户

发布于 2014-01-29 19:47:55

findViewById()只会在您在setContentView()中指定的布局文件中找到视图。您需要将TextView移动到Activity's布局中,或者将此逻辑移动到Fragment中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21440856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档