转载

Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题

众所周知,我们既可以在 activity_main.xml文件中控制activity中的view,也可以使用java代码的set..()方法控制它。在学习过程中,发现在ADT新版本中,和以前版本有区别:

新建Andriod工程后,MainActivity 不再继承Activity,而继承的是ActionBarActivity;在layout文件夹下会自动生成两个.xml文件,activity_main.xml文件和fragement_main.xml文件,和以前的版本只有一个activity_main.xml文件是不一样的。

Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题 Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题

在fragment_main.xml中写一个TextView,内容为Hello World:

<LinearLayout 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:orientation="vertical"  android:paddingBottom="@dimen/activity_vertical_margin"  android:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  tools:context="com.example.textview.MainActivity$PlaceholderFragment" >  <TextView   android:id="@+id/textView"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:background="#FF0000"   android:text="@string/hello_world" /> </LinearLayout> 

我们当然可以在.xml文件中控制文本内容的显示,若是MainActivity中控制文本内容的显示,可以使用代表控件的对象;在以前的只有Activity_main.xml文件的版本中,可以这样写代码:

public class MainActivity extends Activity {    private  TextView textView;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);      textView = (TextView)findViewById(R.id.textView);//向下转型为TextView类型,根据xml文件中ID找到该TextView,
textView.setBackgroundColor(Color.BLUE);//设置背景颜色 if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } } }

但是在新的版本中,继承的不再是activity,而是ActionBarActivity,而且在layout中有两个xml文件,若是按照上述的方式写,程序无法运行,解决这个问题的方法如下:

1.在内部静态类PlaceholderFragment 中的onCreateView()方法中获取textView对象,而不是在onCreate()方法中获取这个对象。

2.因为是内部静态类,故应该声明为private static TextView textView;

运行 程序,OK

package com.example.textview;  import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.os.Build;  public class MainActivity extends ActionBarActivity {    private static TextView textView;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main); //空指针异常   //  textView = (TextView)findViewById(R.id.textView);//此处无法获得该对象 //  textView.setBackgroundColor(Color.BLUE);    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 {    public PlaceholderFragment() {   }      @Override   public View onCreateView(LayoutInflater inflater, ViewGroup container,     Bundle savedInstanceState) {    View rootView = inflater.inflate(R.layout.fragment_main, container,      false);    textView = (TextView) rootView.findViewById(R.id.textView);//在这里获得该对象 OK!!!    textView.setText("Hello");    return rootView;   }  }  }
正文到此结束
Loading...