片段内的接口返回null值

时间:2017-11-22 08:51:29

标签: android android-fragments

  

在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();
    }
}

}

1 个答案:

答案 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();