初始化片段中的EditText
我有一个带有项目的导航抽屉。在点击某个项目时,会打开一个片段,其中edittext
,一个微调框和许多textviews
会打开,显示完美。 现在,我想为我的editText
添加textWatcher
,但该应用崩溃,给我一个NullPointerException
。我认为这是因为我使用了片段,因为如果将代码放入主Activity中,完全相同的代码完美无缺。 这里是所有相关代码:初始化片段中的EditText
MainActivity.java
// just before onCreate method
EditText LengthInput;
// in the onNavigationItemSelected method, that is
// responsible for the item clicks, This loads the fragment
LengthFragment lengthFragment = new LengthFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, lengthFragment);
transaction.addToBackStack(null);
transaction.commit();
// this method is responsible for the basic functionality
initializeLengthFragment();
...
// this is later on in the initializeLengthFragment()
LengthInput = (EditText) findViewById(R.id.LengthInput);
LengthInput.addTextChangedListener(lengthInputWatcher);
最后一行是在错误发生;我在onCreate之前初始化LengthInput并稍后使用它(最后2行)。
length_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
android:id="@+id/length_fragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TableRow
android:id="@+id/table1Row1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dip" >
<EditText
android:id="@+id/LengthInput"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberDecimal"
android:hint="@string/EditTextHintText"
android:gravity="center"
android:background="@android:drawable/edit_text"
android:textColor="@android:color/primary_text_light" />
<requestFocus/>
</TableRow>
...
LengthFragment.java:
package com.example.lukas.navigationdrawer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class LengthFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.length_fragment, container, false);
}
}
您的编辑文本需要在片段类中进行初始化,并且文本观察器等的所有代码也应位于片段内。
活动应该只负责携带您的片段,并且您希望执行的任何其他逻辑或任务应该在您的片段中,并且应该通过覆盖片段的onCreateView方法来完成视图初始化。 这里是你的片段类的快照。
public class LengthFragment extends Fragment {
EditText LengthInput;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View yourFragmentUI = inflater.inflate(R.layout.length_fragment, container, false);
lengthInput = (EditText) yourFragmentUI .findViewById(R.id.lengthInput);
lengthInput.addTextChangedListener(lengthInputWatcher);
return yourFragmentUI;
}
}
LengthInput
的EditText是内部length_fragment.xml
是LengthFragment
片段的布局而不是活性的影响。
所以无论使用onViewCreated
或更改onCreateView
方法:
@Override
public View onCreateView(....) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.length_fragment, container, false);
EditText LengthInput = (EditText)view. findViewById(R.id.LengthInput);
return view;
}
您必须初始化EDITTEXT你LengthFragment片段。就像这样:
package com.example.lukas.navigationdrawer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class LengthFragment extends Fragment {
EditText lengthInput;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.length_fragment, container, false);
lengthInput = (EditText) v.findViewById(R.id.lengthInput);
lengthInput.addTextChangedListener(lengthInputWatcher);
return v;
}
}
在我的MainActivity中,我与Edittext有什么关系呢?我修改了LengthFragment.java,但没有包含textWatcher。我仍然得到同样的错误。 那我会在哪里包含textWatcher呢? – Etzomat
您必须将您的textwatcher包含在LengthFragment.java片段中。您只在主要活动中执行任务是初始化片段并将其添加到您的活动中。其他所有你想要在视图上执行的操作应该在片段本身。 –
您没有在代码初始化lengthInputWatcher任何地方。在做完所有基本的事情之后,也就是在初始化所有事情之后,还要加上这些行将这些行放在函数的底部。
initializeLengthFragment();
让我知道你是否需要任何帮助,如果它有帮助标记它。
你是对的(和其他两个人一样),但我选择你的答案是“正确的”,因为你已经提到了在这里移动其他代码。作为一名非常新的程序员,我不会事先知道这一点,所以你的回答对我来说是最有帮助的。 – Etzomat