调用findViewById()方法时,对象引用变为null

时间:2016-01-03 22:56:27

标签: android

我正在学习动作视图并且正在学习这个简短的教程: http://wptrafficanalyzer.in/blog/adding-custom-action-view-to-action-bar-in-android/

但我不知道为什么EditText对象在运行时变为null。请帮帮我。

MainActivity:

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /** Create an option menu from res/menu/items.xml */
        getMenuInflater().inflate(R.menu.items, menu);

        /** Get the action view of the menu item whose id is search */
        View v = (View) menu.findItem(R.id.search).getActionView();

        /** Get the edit text from the action view */
        EditText txtSearch = ( EditText ) v.findViewById(R.id.txt_search);

        /** Setting an action listener */
        txtSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                Toast.makeText(getBaseContext(), "Search : " + v.getText(), Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }
}

items.xml

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/photo"
        android:title="Photo"
        app:showAsAction="ifRoom|withText"
        />

    <item
        android:id="@+id/video"
        android:title="Video"
        app:showAsAction="ifRoom|withText"
        />

    <item
        android:id="@+id/mobile"
        android:title="Mobile"
        app:showAsAction="ifRoom|withText"
        />

    <item
        android:id="@+id/search"
        android:title="Search"
        app:showAsAction="ifRoom|collapseActionView"
        android:actionLayout="@layout/search_layout"
        />

</menu>

search_layout.xml:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <EditText
        android:id="@+id/txt_search"
        android:inputType="text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

2 个答案:

答案 0 :(得分:0)

您的iron-list布局引用了错误的文件。更改为(我猜是文件的名称)setContentView(R.layout.activity_main);

答案 1 :(得分:0)

在您的评论中,您声明xml文件名为search_layout.xmlitems.xml。现在,在您的代码中,您会注意到这一行:

setContentView(R.layout.activity_main);

这很重要,所以请听:这行代码基本上说,这里是属于这个java类的对应的xml文件(布局资源元素)。现在,有什么意义这个的?好吧,如果你想访问名为hello的xml文件内容中的内容,并更改图像按钮的图像,则在指定图像按钮的位置之前,你不能这样做。< /强>

XML:我是屏幕的样子!

Java:我对某些屏幕做了什么。什么屏幕?好吧,该屏幕在setContentView行中描述。

所以,当你深入到android时,你将开始获得越来越多的XML文件,你需要指定你正在谈论的那个,以便java(你的程序的大脑)知道什么做什么,去哪做。

希望这有帮助,如果有,请告诉我!

Ruchir