java - EditText 在其他方法上变为 null

标签 java android android-fragments android-edittext object-reference

myfragment类女巫扩展Fragment中,我在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

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

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

我正在从保存此 Fragment 的 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();
    }

}

最佳答案

您正在 fragment 的新实例上调用 SaveDream 方法,而不是现在加载的实例

AddFragment mActivity= new AddFragment();
mActivity.SaveDream();

因为 View 不是在新实例上创建的( View 是在加载时创建的),并且 EditText 的值为 null。您应该全局保留加载的实例并调用该实例上的方法。

请按照以下步骤操作。

第 1 步:创建类级别变量

private AddFragment mFragment;

第 2 步:像这样加载 fragment

mFragment = new AddFragment();

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

第3步:像这样调用方法

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;    

关于java - EditText 在其他方法上变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37663683/

相关文章:

android - 我想在 fragment 中创建图像幻灯片 View ?

java - java中与异常处理相关的错误

android - 未找到 TextView

java - 如何在不使用循环器和处理程序的情况下在特定线程中调度任务?

Android:PreferenceFragment 与自定义 Preference 生命周期不一致?

Android 在屏幕旋转时复制 fragment

java - Tomcat 8 正在运行但拒绝连接

java - Java 代码生成器的更好方法?

java - 如何从 Subclipse 中的 svn repo 同步中排除文件?

java - 方法...必须覆盖父类(super class)方法(最新 SDK)