我试图了解何时应该使用oncreate方法或oncreateview方法。
我有点困惑。首先我有一些代码,包括OnCreate()方法中的findViewById()等语句。但是它总是以空指针Exception响应,然后有人告诉我应该把它放在OnCreateView()方法中。它工作,但我不明白我应该在OnCreate()中放置代码的时间和内容,或者我应该放在OnCreateView()中的时间和内容。有人可以向我解释一下。
答案 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");
}