我必须在OnCreate()中添加什么样的代码,何时必须将它放在OnCreateView()中?

时间:2014-06-13 11:41:28

标签: android oncreate findviewbyid

我试图了解何时应该使用oncreate方法或oncreateview方法。

我有点困惑。首先我有一些代码,包括OnCreate()方法中的findViewById()等语句。但是它总是以空指针Exception响应,然后有人告诉我应该把它放在OnCreateView()方法中。它工作,但我不明白我应该在OnCreate()中放置代码的时间和内容,或者我应该放在OnCreateView()中的时间和内容。有人可以向我解释一下。

2 个答案:

答案 0 :(得分:0)

在我的代码中,方法如下:

ACTIVITY代码:

@Override
public void onCreate(Bundle saveInstanceState)
{
    super.onCreate(saveInstanceState);
    this.setContentView(R.layout.activity_container);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    if (saveInstanceState == null)
    {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.activity_container_container, new MyFragment()).addToBackStack(null).commit();
    }
    getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener()
    {
        public void onBackStackChanged()
        {
            int backCount = getSupportFragmentManager().getBackStackEntryCount();
            if (backCount == 0)
            {
                finish();
            }
        }
    });
}

@Override
public void myInterface()
{
    System.out.println("Do stuff;");
}

FRAGMENT代码:

private int titleId;
private Button placeholderButton;

private MyInterface activity_myInterface;

public MyFragment()
{
    super();
    this.titleId = R.string.my_actionbar_title;
}

@Override
public void onAttach(Activity activity)
{
    super.onAttach(activity);
    try
    {
        activity_myInterface = (MyInterface)activity;
    }
    catch(ClassCastException e)
    {
        Log.e(this.getClass().getSimpleName(), "MyInterface interface needs to be implemented by Activity.", e);
        throw e;
    }
}

//this is an interface defined by me
@Override
public int getActionBarTitleId()
{
    return titleId;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_myfragment, container, false);
    placeholderButton = (Button)view.findViewById(R.id.myfragment_placeholderbtn);
    placeholderButton.setOnClickListener(this);
    return view;
}

@Override
public void onClick(View v)
{
    if(v == placeholderButton)
    {
        System.out.println("Do more stuff");
    }
}

R.layout.activity_container是:

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

    <FrameLayout
        android:id="@+id/activity_container_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

这样Activity就负责包含Fragment(这个片段在onCreate()中创建),Fragment负责显示UI和事件处理。但是,您可以在活动中拥有多个片段,这就是他们主要设计的内容。

答案 1 :(得分:0)

如果您正在使用Activity,那么您可以远离onCreateView。

坚持默认activity lifecycle

在onCreate方法中对布局(内容)进行了膨胀(创建)。

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

然后,一旦它被充气,你就可以使用它并操纵属于它的视图。

findViewById()为您返回null,因为布局尚未准备好使用,因为它尚未充气。您可以在findViewById() {。}}之后setContentView()使用onCreate

findViewById()是一种在性能上非常难的方法(如果多次调用),所以你应该在onCreate中获得所需的所有视图,并将它们保存到实例变量中,如:

TextView textView1,textView2;

覆盖 protected void onCreate(Bundle savedInstanceState){     super.onCreate(savedInstanceState);     的setContentView(R.layout.activity_book);     textView1 = findViewById(R.id.textview1);     textView2 = findViewById(R.id.textview2);     ... }

并在onStart中使用它们:

@Override
protected void onStart() {
    super.onStart();
    if (textView1 != null) textView1.setText("myText");
    if (textView2 != null) textView2.setText("some other text");
}