【问题标题】:AutoCompleteTextView in fragment get NullPointerException片段中的 AutoCompleteTextView 获取 NullPointerException
【发布时间】:2013-11-16 12:18:36
【问题描述】:

我尝试在片段中使用 AutoCompleteTextView,但在autoCompleteTextViewCountry.setAdapter(adapter); 出现异常我使用示例代码,但此示例在标准活动中使用它而不是在片段中,所以我认为问题出在此处:

我的代码: ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.iMainActivity, android.R.layout.simple_dropdown_item_1line, COUNTRIES);

原始示例代码: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES);

全班:

    public class SettingsActivity extends Activity {
   public static SettingsActivity iSettingsActivity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

    public SettingsActivity(){
     iSettingsActivity=this;
    }

    public static class PlaceholderFragment extends Fragment {
        public PlaceholderFragment() {
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_settings, container, false);

            String COUNTRIES[]={"INDIA","ITALY","JAPAN","USA","ICELAND","INDONESIA","UK","IRAN","IRAQ"};
            final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView1);
            final TextView textViewSelectedCountry=(TextView)rootView.findViewById(R.id.textViewCountry);
            Button btnSelectedCountry=(Button)rootView.findViewById(R.id.buttonSelectCountry);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.iMainActivity,
                    android.R.layout.simple_dropdown_item_1line, COUNTRIES);

            autoCompleteTextViewCountry.setAdapter(adapter);
            autoCompleteTextViewCountry.setThreshold(1);

            btnSelectedCountry.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    String country=autoCompleteTextViewCountry.getText().toString();
                    textViewSelectedCountry.setText("Selected Country: "+country);
                }
            });
            return rootView;
        }
    }
}

完整的xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".SettingsActivity$PlaceholderFragment"
android:background="@color/myBlack"
    >

<TextView
    android:id="@+id/textViewCountry"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="You Selected :"
    android:textColor="@color/white"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:layout_below="@+id/autoCompleteTextView"
    android:layout_alignParentLeft="true" />

<AutoCompleteTextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/white"
    android:layout_below="@+id/autoCompleteTextView1"
    android:layout_marginTop="20dp"
    android:layout_alignParentLeft="true"
    android:ems="10"
    android:hint="Choose The Country"
    android:id="@+id/autoCompleteTextView">
    <requestFocus />
</AutoCompleteTextView>

<Button
    android:id="@+id/buttonSelectCountry"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="          OK          "`enter code here`
    android:layout_below="@+id/textViewCountry"
    android:layout_alignParentLeft="true" />

</RelativeLayout>

【问题讨论】:

  • Fragment 中获取Context 引用的正确方法是使用getActivity() 而不是您正在使用的可怕的静态字段。

标签: java android exception android-fragments nullpointerexception


【解决方案1】:

改变这一行

final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView1);

final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView);

您传递了错误的 id,因此它给出了 NullPointerException

【讨论】:

  • 在 android:layout_below="@+id/autoCompleteTextView1" 的 XML 文件中也是错误的
【解决方案2】:

改变这一行

ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.iMainActivity,
                android.R.layout.simple_dropdown_item_1line, COUNTRIES);

喜欢这个..

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_dropdown_item_1line, COUNTRIES);

并删除静态字段..

【讨论】:

    【解决方案3】:

    在这一行: ArrayAdapter 适配器 = 新的 ArrayAdapter(MainActivity.iMainActivity, android.R.layout.simple_dropdown_item_1line, COUNTRIES);

    ArrayAdapter 的第一个参数应该是上下文, 当片段托管在 Activity 中时,在本例中为 (MainActivity) 上下文应该是 - getActivity()

    片段不应该对它的父托管 Activity 有特定的了解。

    改变它,运行它,它应该可以工作:)

    【讨论】:

      【解决方案4】:

      您使用错误 ID autoCompleteTextView1 膨胀的 AutoComplete Textview。

      试试这个:

      final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView);
      

      而不是

      final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView1);
      

      同时更改以下语句

      ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.iMainActivity,
                      android.R.layout.simple_dropdown_item_1line, COUNTRIES);
      

      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                      android.R.layout.simple_dropdown_item_1line, COUNTRIES);
      

      我希望这对你有用。

      【讨论】:

        【解决方案5】:

        您需要更改此代码行:

        final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView1); 
        

        到这里:

        final AutoCompleteTextView autoCompleteTextViewCountry = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextView);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-12
          • 1970-01-01
          • 1970-01-01
          • 2016-05-31
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          相关资源
          最近更新 更多