变量在onClick内部为null,但不在onCreate of Fragment上

时间:2017-10-26 05:35:09

标签: android android-fragments onclick data-extraction

我试图将一些变量从一个活动传递给一个片段,然后再传回一个活动。在片段的onCreate内,getArguments()不为空,我能够获取变量。但是,在片段的onClick内(触发返回活动),getArguments()onCreate中检索到的变量为空。

在我的活动中:

  public void goToFragment() {
    MyFragment myFragment = new MyFragment();
    // create new bundle and put extras
    Bundle myExtras = new Bundle();
    myExtras.putString("firstName", firstName);
    myExtras.putString("lastName", lastName);
    myExtras.putString("favoriteColor", favoriteColor);
    myFragment.setArguments(myExtras);        
    // start the fragment
    getFragmentManager().beginTransaction()
                        .replace(R.id.container, myFragment.newInstance())
                        .add(myFragment, myExtras.toString())
                        .commit();
  }

我的片段:

public class MyFragment extends Fragment implements View.OnClickListener {

    private String firstName;
    private String lastName;
    private String favoriteColor;

    private Button myButton;

    ...

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            firstName = MyFragment.this.getArguments().getString("firstName");
            lastName = MyFragment.this.getArguments().getString("lastName");
            favoriteColor = MyFragment.this.getArguments().getString("favoriteColor");
            Log.d(TAG, "Extras from activity page: firstName = " + firstName + ", lastName = " + lastName + ", favoriteColor = " + favoriteColor);
        } else {
            Log.v(TAG, "getArguments() != null");
        }
    }

    @Override
    public void onViewCreated(final View view, Bundle savedInstanceState) {
        myButton = (Button) view.findViewById(R.id.myButton);
        myButton.setOnClickListener(this);
    }

    ...

    @Override
    public void onClick(View view) {
        Log.d(TAG, "onClick: triggered...");

        // **ISSUE:** my variables are null here even though they were set in the `onCreate`
        Log.d(TAG, "onClick: firstName = " + firstName);
        Log.d(TAG, "onClick: lastName = " + lastName);
        Log.d(TAG, "onClick: favoriteColor = " + favoriteColor);

        // Alternative attempt: get extras
        //if (MyFragment.this.getArguments() != null) {
        //    firstName = getArguments().getString("firstName");
        //    lastName = getArguments().getString("lastName");
        //    favoriteColor = getArguments().getString("favoriteColor");
        //    Log.d(TAG, "Extras getArguments(): firstName = " + firstName + ", lastName = " + lastName + ", favoriteColor = " + favoriteColor);
        //} else {
        //    Log.d(TAG, "getArguments() != null");
        //}

        // initiate intent
        Intent intent = new Intent(getActivity(), MyActivity.class);
        intent.putExtra("firstName", firstName);
        intent.putExtra("lastName", lastName);
        intent.putExtra("favoriteColor", favoriteColor);
        startActivity(intent);
        break;
    }
}

替代尝试:

  • 我也尝试在firstName
  • 中将MyFragment.this.firstName更改为onClick
  • 认为问题可能是在onClick内无法访问片段的变量,我还尝试从onCreate获取代码并将其放在onClick内(所以单击按钮时设置变量,但getArguments()MyFragment.this.getArguments()(和onClick)为空

是否有人理解为什么我的变量在片段onClick但不是onCreate内是空的(以及如何防止此问题)?

3 个答案:

答案 0 :(得分:2)

试试这个

getFragmentManager().beginTransaction()
                    .replace(R.id.container, myFragment)
                    .commit();

而不是

 getFragmentManager().beginTransaction()
                     .replace(R.id.container, myFragment.newInstance())
                     .add(myFragment, myExtras.toString())
                     .commit();

答案 1 :(得分:0)

  

当应用程序尝试使用时抛出NullPointerException   具有空值的对象引用。

更新 replace 方法。删除 .add 方法。

.replace(R.id.container, _fragmentOBJ)

<强>结构

  

FragmentTransaction replace(int containerViewId,                   片段片段)

然后

Bundle bundle = getArguments();
firstName = bundle.getString("firstName","");

答案 2 :(得分:0)

我可以在发布的代码中看到两个问题。

  1. 为何使用add()replace()。根据您的要求选择任何一种。
  2. 您已使用Fragment关键字

    创建了new的实例

    MyFragment myFragment = new MyFragment();并设置参数。

  3. 但在myFragment.newInstance()中调用replace()。希望(作为代码未共享)newInstance()正在创建Fragment的另一个实例,并且没有为该实例设置参数。这可能会导致片段中出现空参数。