Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在FragmentActivity和Fragment之间发送数据_Java_Android_Android Fragments - Fatal编程技术网

Java 在FragmentActivity和Fragment之间发送数据

Java 在FragmentActivity和Fragment之间发送数据,java,android,android-fragments,Java,Android,Android Fragments,我的主要活动中有一个SearchView。我想将输入的文本传递到包含ListView的片段中,并能够使用适配器过滤列表 问题是使用下面的代码,我可以将输入的文本传递给片段,但随后我得到一个nullpointer异常 注意:适配器工作正常。我还尝试将片段中的TextView设置为传递的字符串,但应用程序也崩溃了 在主要活动中: @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater infla

我的主要活动中有一个SearchView。我想将输入的文本传递到包含ListView的片段中,并能够使用适配器过滤列表

问题是使用下面的代码,我可以将输入的文本传递给片段,但随后我得到一个nullpointer异常

注意:适配器工作正常。我还尝试将片段中的TextView设置为传递的字符串,但应用程序也崩溃了

在主要活动中:

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.activity_main_actions, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) searchItem.getActionView();  
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); 

    SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
    {

      @Override
        public boolean onQueryTextSubmit(String query)
        {
            TopRatedFragment newFragment = new TopRatedFragment();  //FOR PASSING TEXT
            Bundle args = new Bundle();
            args.putString("hii", query);
            newFragment.setArguments(args);
            newFragment.kl();
            android.support.v4.app.FragmentTransaction transaction =                
             getSupportFragmentManager().beginTransaction();
              transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();

            System.out.println("on query submit: "+query);
            return true;
        }
    };
    searchView.setOnQueryTextListener(textChangeListener);

     return super.onCreateOptionsMenu(menu);
片段:

    public void kl(){
    String menu = getArguments().getString("hii");
    adapter.getFilter().filter("hii");
}
日志:

 10-16 09:26:23.234: E/AndroidRuntime(19960): FATAL EXCEPTION: main
 10-16 09:26:23.234: E/AndroidRuntime(19960): java.lang.NullPointerException
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at  com.example.tab.TopRatedFragment.kl(TopRatedFragment.java:51)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at     com.example.tab.MainActivity$3.onQueryTextSubmit(MainActivity.java:160)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at   android.widget.SearchView.onSubmitQuery(SearchView.java:1203)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at android.widget.SearchView.access$900(SearchView.java:93)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at android.widget.SearchView$8.onEditorAction(SearchView.java:1178)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at android.widget.TextView.onEditorAction(TextView.java:4973)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at    com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:297)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at android.os.Handler.dispatchMessage(Handler.java:99)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at android.os.Looper.loop(Looper.java:176)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at android.app.ActivityThread.main(ActivityThread.java:5419)
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at java.lang.reflect.Method.invokeNative(Native Method)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at java.lang.reflect.Method.invoke(Method.java:525)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at dalvik.system.NativeStart.main(Native Method)
好的,所以我发现问题是在片段类中,在onCreateView之外,视图是空的,因此任何attributeTextView、适配器。。。是空的。这就是为什么我得到空指针异常。但似乎找不到解决方法,因为我想在oncreateview之外设置适配器,请参阅

请使用共享首选项:

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
 editor.putString("name", "Elena");
 editor.putInt("idName", 12);
 editor.commit();


// MY_PREFS_NAME - a static String variable like: 
//public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String restoredText = prefs.getString("text", null);
if (restoredText != null) {
  String name = prefs.getString("name", "No name defined");//"No name defined" is the default value.
  int idName = prefs.getInt("idName", 0); //0 is the default value.
}

在片段中,可以调用getActivity。这将允许您访问创建片段的活动。显然,您可以从那里调用活动中的任何类型的访问器方法

榜样 从碎片活动:

Bundle bundle = new Bundle();
bundle.putString("message", "Alo Elena!");
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();
在片段中获取价值

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
}
 public interface OnManufacturerSelectedListener {
            public void onManufacturerSelected(String Manufacturer);
        }

您可以通过定义接口在片段之间进行通信。 在这里描述

在片段中定义一个面

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
}
 public interface OnManufacturerSelectedListener {
            public void onManufacturerSelected(String Manufacturer);
        }
在方法kl中:

 public void kl(){
    String menu = getArguments().getString("hii");
    OnManufacturerSelectedListener.onManufacturerSelected("hii");
}
然后在MainActivity中实现OnManufactureSelectedListener

@Override
        public void onManufacturerSelected(String Manufacturer) {
            String hi=Manufacturer;
        }

然后发布日志,而不是在onQueryTextSubmit中调用kl方法。将捆绑包传递给fragment并在onCreateView中将其解绑。但是onCreateView不是只调用一次吗?以前已调用过该片段并且可以查看它的viewpageronCreateView每次都会调用OK谢谢我得到了它,但是,如果片段是在创建activitiy时创建的,因此它在屏幕上,在单击或其他操作时没有被调用,并且我想传递一个在activity中的SearchView中输入的字符串,该怎么办呢。因此,我无法在onCreateView上传递包中的内容,因为MainActivity的ActionBar和片段始终同时可见。因此,onCreateView仅在应用程序启动时被调用–您可以在nResume中写入它。每当你的活动可见时,它就会被调用。