初始化片段中的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; 
} 
} 
+0

你是对的(和其他两个人一样),但我选择你的答案是“正确的”,因为你已经提到了在这里移动其他代码。作为一名非常新的程序员,我不会事先知道这一点,所以你的回答对我来说是最有帮助的。 – Etzomat

LengthInput的EditText是内部length_fragment.xmlLengthFragment片段的布局而不是活性的影响。

所以无论使用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; 
} 

}

+0

在我的MainActivity中,我与Edittext有什么关系呢?我修改了LengthFragment.java,但没有包含textWatcher。我仍然得到同样的错误。 那我会在哪里包含textWatcher呢? – Etzomat

+0

您必须将您的textwatcher包含在LengthFragment.java片段中。您只在主要活动中执行任务是初始化片段并将其添加到您的活动中。其他所有你想要在视图上执行的操作应该在片段本身。 –

您没有在代码初始化lengthInputWatcher任何地方。在做完所有基本的事情之后,也就是在初始化所有事情之后,还要加上这些行将这些行放在函数的底部。

initializeLengthFragment(); 

让我知道你是否需要任何帮助,如果它有帮助标记它。

+0

lengthInputWatcher实际上是初始化的,但我没有将它包含在代码中,因为问题似乎是片段中edittext的初始化。 我猜其他2个答案是更正确的方向,但我不能让它明显地与任何一个运行。 – Etzomat

+0

写下你的完整code.i会把它整理出来:) :) –

+0

我已经明白了,谢谢!看到farhan patel的答案;) – Etzomat