在onAttach()方法中, communicator =(Communicator)活动返回null。当我点击图像视图时,它显示 communicatior 的值为空。 我已经检查但无法解决问题。在片段中单击图像视图时,一些数据应该转移到活动。但Interface Commnunicator communicator的引用变量在 onAttch()
中获取空值
public class SendFragment extends Fragment {
ImageView imgContact;
TextView tvContactName;
String username;
Communicator communicator;
public interface Communicator {
public void sendDataToActivity(String s);
}
public static final String TAG = SendFragment.class.getSimpleName();
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Communicator) {
communicator = (Communicator) context;
} else {
throw new IllegalArgumentException(
"Must implement " + TAG + ".Communicator on caller Activity");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_send, container, false);
imgContact = (ImageView) view.findViewById(R.id.contactbook);
tvContactName = (TextView) view.findViewById(R.id.tvcontactname);
if(!TextUtils.isEmpty(username)) {
username = getArguments().getString("username").toString();
tvContactName.setText(username);
}
listeners();
return view;
}
private void listeners() {
imgContact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
communicator.sendDataToActivity(Constants.selectUserName);
Intent intent = new Intent(getActivity(), AllContactsListActivity.class);
startActivity(intent);
}
});
}
}
现在以下是我的活动代码..
public class AllContactsListActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, SendFragment.Communicator,RecyclerViewAdapter.OnItemClick {
Context context;
RecyclerView recyclerView;
RecyclerView.Adapter recyclerViewAdapter;
RecyclerView.LayoutManager recylerViewLayoutManager;
ImageButton btnSliding_common;
DrawerLayout drawer;
NavigationView navigationView;
String sendFragmentStringFlag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_contacts_list);
setIds();
listeners();
}
private void listeners() {
recyclerViewAdapter = new RecyclerViewAdapter(AllContactsListActivity.this, subjects, emails, address,this);
recyclerView.setAdapter(recyclerViewAdapter);
RecyclerView.ItemDecoration itemDecoration =
new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
recyclerView.addItemDecoration(itemDecoration);
btnSliding_common.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
drawer.openDrawer(GravityCompat.END);
}
});
}
private void setIds() {
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
btnSliding_common = (ImageButton) findViewById(R.id.btnSliding_contact);
drawer = (DrawerLayout) findViewById(R.id.drawer_layout_contact);
navigationView = (NavigationView) findViewById(R.id.nav_view_contact);
recylerViewLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(recylerViewLayoutManager);
}
@Override
public void sendDataToActivity(String sendMoneyflag) {
sendFragmentStringFlag=sendMoneyflag;
}
@Override
public void onClick(String username) {
if(!TextUtils.isEmpty(sendFragmentStringFlag)) {
if (sendFragmentStringFlag.equals(Constants.selectUserName)) {
Toast.makeText(this, "You clicked " + username, Toast.LENGTH_SHORT).show();
Bundle bundle = new Bundle();
bundle.putString("username", username);
SendFragment sendFragment = new SendFragment();
sendFragment.setArguments(bundle);
finish();
}
}else{
Toast.makeText(this, "USER NAME" + username, Toast.LENGTH_SHORT).show();
}
}
}
答案 0 :(得分:0)
问题可能是因为主机活动没有实现Fragment接口。
您尝试使用以下方法附加界面:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
communicator = (Communicator) activity;
} catch (Exception e){}
}
但是你没有正确处理Exception。因此,您不知道何时正确设置了界面。您还可以覆盖现已弃用的onAttach(Activity activity)
。
您需要更改以下代码:
public static final String TAG = YourFragment.class.getSimpleName();
...
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Communicator) {
communicator = (Communicator) context;
} else {
throw new IllegalArgumentException(
"Must implement " + TAG + ".Communicator on caller Activity");
}
}
如果您的主机活动没有实现该接口,则会抛出错误。
您还需要使用FragmentTransaction将片段附加到您的活动。像这样:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
SendFragment sendFragment = new SendFragment();
fragmentTransaction.add(R.id.fragment_container, sendFragment);
fragmentTransaction.commit();