EditText 在其他方法上变为 null

EditText becomes null on other methods

myfragment class extends Fragment 我在 [=29= 找到对象引用]onCreateView 方法

private static final String TAG = "CloadLab";


private Cloud dCloud;
private EditText dNameText;
public String dNameHolder = "";




@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    UUID dreamId = (UUID)getArguments().getSerializable(EXTRA_DREAM_ID);




}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    getActivity().setTitle("Add new");

}

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup parent, Bundle savedInstanceState){

    View v = inflater.inflate(R.layout.fragment_add,parent,false);

    dNameText = (EditText) v.findViewById(R.id.dream_name);


    return v;
}

public void SaveDream (){


    dNameHolder = dNameText.getText().toString();

    if (dNameText != null) {
        Log.e(TAG,"not null");
    }else if (dNameText == null){
        Log.e(TAG,"null");
    }


}

}

如果我在 onCreateView 方法中使用它,效果很好,但是例如我想在这个方法中使用 dNameText相同 class

public void SaveDream (){
   dNameHolder = dNameText.getText().toString();
}

现在它有空对象引用我该如何解决这个问题以及如何在整个 class 中设置引用?

我正在从 Activity 中调用此 SaveDream() 方法,其中包含此片段

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.action_favorite:

            AddFragment mActivity= new AddFragment();
            mActivity.SaveDream();
            finish();
            return true;
    }

    return super.onOptionsItemSelected(item);


}

每个 Activity 扩展 SingleFragmentActivity 并在其中包含这些方法

        private AddFragment mFragment;

@Override
    protected Fragment createFragment() {

    UUID dreamId = (UUID)getIntent()
            .getSerializableExtra(AddFragment.EXTRA_DREAM_ID);
    return AddFragment.newInstance(dreamId);
}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        //setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.action_bar_menu,menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.action_favorite:

               // AddFragment mActivity= new AddFragment();
               // mActivity.SaveDream();
                //finish();
                mFragment = new AddFragment();
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(android.R.id.content, mFragment);
                fragmentTransaction.commit();
                mFragment.SaveDream();
                finish();
                return true;
        }

        return super.onOptionsItemSelected(item);


    }

SingleFragmentActivity

    protected abstract Fragment createFragment();

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragment);
    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);

   // getSupportActionBar().setDisplayHomeAsUpEnabled(false);


    if (fragment == null){
        fragment = createFragment();
        fm.beginTransaction()
                .add(R.id.fragmentContainer, fragment)
                .commit();
    }

}

您正在片段的一个新实例上调用 SaveDream 方法,而不是现在在

加载的那个实例
AddFragment mActivity= new AddFragment();
mActivity.SaveDream();

因为视图不是在新实例上创建的(视图是在加载时创建的)并且您得到的 EditText 为空。您应该全局保留加载的实例并在该实例上调用该方法。

按照以下步骤操作。

第一步:创建一个class级变量

private AddFragment mFragment;

第 2 步: 像这样加载片段

mFragment = new AddFragment();

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(android.R.id.content, mFragment);
fragmentTransaction.commit();

第三步:这样调用方法

mFragment.SaveDream();

更新

像这样更新方法

@Override
protected Fragment createFragment() {
    UUID dreamId = (UUID)getIntent()
        .getSerializableExtra(AddFragment.EXTRA_DREAM_ID);
    mFragment = AddFragment.newInstance(dreamId);
    return mFragment;
}

case R.id.action_favorite:
    mFragment.SaveDream();
    return true;