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