刚学Android遇到的问题,findViewById值为null(新版本),老鸟欢迎你的指正_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 刚学Android遇到的问题,findViewById值为null(新版本),老鸟欢迎你的指正

刚学Android遇到的问题,findViewById值为null(新版本),老鸟欢迎你的指正

 2014/6/15 21:24:31  树琦  程序员俱乐部  我要评论(0)
  • 摘要:环境交代:刚学Android,在官网下载的新版的ADT以及新版的SDK在新版的IDE(ADT)创建项目时如果你的最小版本(minimumrequiredSDK)要支持4.0以下版,并且目标版本为(4.0+).那么此时IDE会为你创建一个兼容包(appcompat_v7)如下图,创建发短信项目后就会有如下的项目目录结构这个时候在生成的项目主Activity不是以前的那种继承的Activity,而是继承的ActionBarActivity,我把发短信的界面创建起。界面效果如下。点此时我用this
  • 标签:android view 问题 新版本 版本

环境交代:

    刚学Android,在官网下载的新版的ADT

  以及新版的SDK

    在新版的IDE(ADT)创建项目时如果你的最小版本minimum required SDK)要支持4.0以下版,并且目标版本为(4.0+).那么此时IDE会为你创建一个兼容包    (appcompat_v7)如下图,

 

    创建发短信项目后就会有如下的项目目录结构

19991C1.png" alt="" />

 

 

  这个时候在生成的项目主Activity不是以前的那种继承的Activity,而是继承的ActionBarActivity,我把发短信的界面创建起。界面效果如下。点此时我用      this.findViewById(R.id.but_send);来得到发短信界面的Button按钮。但是没得到我想要的button,输出button为null。

 

这让我一个初学android的这咋整??百度一哈没有可用的答案,于是自己解决。

解决办法

捣鼓很久后捣鼓成功代码如下,原因是因为在新的layout文件不是存放在默认的(res/layout/activity_main.xml)文件中,而是存放在(res/layout/fragment_main.xml)文件中。所以要在fragment_main.xml去早对应的ID才会找到,而新的IDE生成的代码中加载(fragment_main.xml)文件是在一个内部加载的,所以我们可以在内部类加载处来得到Button:

package com.shuqi.cms;

import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity{

    private static EditText edt_num = null;
    private static EditText edt_content = null;
    private static Button button = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);        
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        
        View rootView = null;
        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_main, container, false);
            
            edt_num =  (EditText) rootView.findViewById(R.id.edt_cms_num);
            edt_content = (EditText) rootView.findViewById(R.id.edt_cms_content);
            button = (Button) rootView.findViewById(R.id.but_send);
          
//            System.out.println(button);
            
            return rootView;
        }
        
    }

    
    public void onClick(View arg0) {
        
        if(edt_num.getText().toString().trim().equals("")||edt_content.getText().toString().trim().equals("")){
            
            Context context = getApplicationContext();
            CharSequence text = "电话号码或者短信内容不能为空!!";
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
            
        }else{
            
            System.out.println("发短信");
            
            
        }
    }
}

效果图如下:

其他解决findViewById的值为空的方法:

原文地址:http://blog.sina.com.cn/s/blog_5e58565701012q2d.html

错误:findViewById返回Null,报nullpointer错误

网上搜了下,拾人牙慧,总结原因,一般为3种:


1.在另一个view的元素应该用baseView.findViewById()来拿

findViewById()是要指定view的,如果在该view下找不到,自然报null。平时注意养成写view.findViewById()的习惯就不容易错了。

 

2.findViewById在setContentView(R.layout.main);之前.

即在setContentView调用之前,调用了findViewById去找main布局中的界面元素lv_contactbook,那么所得到的lv一定是null。正确的做法是将上面代码中加粗的哪一行,挪至setContentView方法调用之后即可。


3.clean一下工程,让ID重新生成

这种情况是调用LayoutInflater.inflate将布局xml规定的内容转化为相应的对象。比如有rowview.xml布局文件(比如在自定义Adapter的时候,用作ListView中的一行的内容的布局),假定在自定的Adapter的getView方法中有类似如下的代码:
View rowview = (View)inflater.inflate(R.layout.rowview, parent, false);
TextView tv_contact_id =(TextView)rowview.findViewById(R.id.tv_contact_id);
TextView tv_contactname =(TextView)rowview.findViewById(R.id.tv_contactname);

有时候居然也会发现rowview非空,但tv_contact_id和tv_contactname都是null!仔细看代码,怎么也看不出错误来。到底是什么原因造成的呢?答案是Eclipse造成的,要解决这个问题,需要这个项目clean一次(Project菜单 -> Clean子菜单),这样就OK了。

 

发表评论
用户名: 匿名