我正在尝试从 Activity 访问 Fragment。
这是我的片段中的代码:
package com.example.worldfriends;
import java.util.ArrayList;
import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
import com.example.util.StaticValues;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class FragmentMiddle extends ListFragment {
private Button buttonJoin;
private Button buttonLeave;
private EditText etUsername;
private EditText etGroup;
//private ListView listView;
protected GroupListAdapter adapter;
private OnGroupListItemSelectedListener listenerList;
private OnJoinClickListener listenerJoin;
private OnLeaveClickListener listenerLeave;
public static Fragment newInstance(Context context) {
FragmentMiddle fragment = new FragmentMiddle();
return fragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listenerList = (OnGroupListItemSelectedListener)activity;
listenerJoin = (OnJoinClickListener)activity;
listenerLeave = (OnLeaveClickListener)activity;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_middle, container, false);
initComp(view);
return view;
}
@Override
public void onResume() {
super.onResume();
if(StaticValues.groupList != null) { // input thread is finised, update with values
Log.d("Karl", "groupList not null");
adapter = new GroupListAdapter(getActivity(), R.layout.group_row, StaticValues.groupList);
setListAdapter(adapter);
}
Log.d("Karl", "FragmentMiddle: onResume() - END");
}
@Override
public void onDetach() {
super.onDetach();
listenerList = null;
listenerJoin = null;
listenerLeave = null;
}
private void initComp(View view) {
buttonJoin = (Button) view.findViewById(R.id.middle_button_join);
buttonLeave = (Button) view.findViewById(R.id.middle_button_leave);
buttonJoin.setOnClickListener(onClickListener);
buttonLeave.setOnClickListener(onClickListener);
etUsername = (EditText) view.findViewById(R.id.middle_input_username);
etGroup = (EditText) view.findViewById(R.id.middle_input_group);
}
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(final View v) {
switch(v.getId()){
case R.id.middle_button_join:
listenerJoin.onJoinClickListener(etGroup.getText().toString(), etUsername.getText().toString());
break;
case R.id.middle_button_leave:
listenerLeave.onLeaveClickListener(etGroup.getText().toString(), etUsername.getText().toString());
break;
}
}
};
@Override
public void onListItemClick (ListView l, View v, int position, long id) {
if(!etUsername.getText().toString().equals("")) {
listenerList.onGroupListItemSelectedListener(StaticValues.groupList.get(position).name, etUsername.getText().toString());
} else {
Toast.makeText(getActivity(), "You must type in a username", Toast.LENGTH_LONG).show();
}
}
public interface OnGroupListItemSelectedListener {
public void onGroupListItemSelectedListener(String group, String member);
}
public interface OnJoinClickListener {
public void onJoinClickListener(String group, String member);
}
public interface OnLeaveClickListener {
public void onLeaveClickListener(String group, String member);
}
}
这是在我的活动中:
private void updateGroupList() {
Log.d("Karl", "MainActivity: updateGroupList()");
FragmentManager manager = getSupportFragmentManager();
FragmentMiddle fragment = (FragmentMiddle) manager.findFragmentById(R.id.fragment_middle);
fragment.adapter.notifyDataSetChanged();
我的问题是日志看起来像这样:
11-01 16:19:09.755: D/Karl(23054): FragmentMiddle: onResume() - END
11-01 16:19:10.974: D/Karl(23054): MainActivity: updateGroupList()
它以正确的顺序运行,但是显然找不到“片段”变量。我的片段类是 FragmentLeft 类。
有任何想法吗?我真的想不出它会是什么。
堆栈跟踪:
11-01 16:59:59.075: E/AndroidRuntime(30027): FATAL EXCEPTION: main
11-01 16:59:59.075: E/AndroidRuntime(30027): java.lang.NullPointerException
11-01 16:59:59.075: E/AndroidRuntime(30027): at com.example.worldfriends.MainActivity.updateGroupList(MainActivity.java:508)
11-01 16:59:59.075: E/AndroidRuntime(30027): at com.example.worldfriends.MainActivity.inputUnparsing(MainActivity.java:401)
11-01 16:59:59.075: E/AndroidRuntime(30027): at com.example.worldfriends.InputThread$1.run(InputThread.java:28)
11-01 16:59:59.075: E/AndroidRuntime(30027): at android.os.Handler.handleCallback(Handler.java:730)
11-01 16:59:59.075: E/AndroidRuntime(30027): at android.os.Handler.dispatchMessage(Handler.java:92)
11-01 16:59:59.075: E/AndroidRuntime(30027): at android.os.Looper.loop(Looper.java:137)
11-01 16:59:59.075: E/AndroidRuntime(30027): at android.app.ActivityThread.main(ActivityThread.java:5103)
11-01 16:59:59.075: E/AndroidRuntime(30027): at java.lang.reflect.Method.invokeNative(Native Method)
11-01 16:59:59.075: E/AndroidRuntime(30027): at java.lang.reflect.Method.invoke(Method.java:525)
11-01 16:59:59.075: E/AndroidRuntime(30027): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-01 16:59:59.075: E/AndroidRuntime(30027): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-01 16:59:59.075: E/AndroidRuntime(30027): at dalvik.system.NativeStart.main(Native Method)
11-01 17:00:01.020: I/Process(30027): Sending signal. PID: 30027 SIG: 9
第 508 行是这样的:
fragment.adapter.notifyDataSetChanged();
ViewPager 代码:
package com.example.worldfriends;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class ViewPagerAdapter extends FragmentPagerAdapter {
private Context context;
private static int totalPage=3;
private int currentItem=1;
public ViewPagerAdapter(Context context, FragmentManager fm) {
super(fm);
this.context = context;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new Fragment();
switch(position){
case 0:
fragment=FragmentLeft.newInstance(context);
break;
case 1:
fragment=FragmentMiddle.newInstance(context);
break;
case 2:
fragment=FragmentRight.newInstance(context);
break;
}
return fragment;
}
@Override
public int getCount() {
return totalPage;
}
public int getCurrentItem() {
return currentItem;
}
}