在我的应用程序中,我需要findViewbyId()从两者onCreate()和来自WebChromeClient.onCompletion().为了避免findViewbyId() 返回null,我在调用Activity.setContentView(int viewResID)之前使用了调用findViewbyId().
它有效,但现在我想知道我是否可能在我的代码中创建一个"定时炸弹".
在做这样的事情时,我需要记住一些警告吗?
我试图更好地理解SQLiteOpenHelper类以及如何以及何时调用onCreate和onUpgrade.
我的问题是,每次我退出并启动我的应用程序(从技术上讲,实际上每次我创建一个新的MyDB实例),onCreate被调用,并且以前用法的所有数据都被有效擦除... WTF ???
我最初通过创建一个单独的MyDBFactory解决了这个问题,我在其中创建了一个MyDB实例.这使得数据在应用程序运行时至少是持久的.
我想要的是我的数据库架构和数据是持久的!
我基本上有:
public class MyDB extends SQLiteOpenHelper{
private static int VERSION = 1;
...
public ContactControlDB(Context context) {
super(context, null, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(DATABASE_CREATE);
db.execSQL(INSERT_DATA);
} catch (SQLException ex) {
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
和:
public class MyDBFactory{
private static MyDB db;
public static MyDB getInstance(Context context) {
if(db == null) {
db = new MyDB (context);
}
return db;
}
Run Code Online (Sandbox Code Playgroud)
}
我想知道的是为什么每次我有'新MyDB(上下文)'时调用onCreate,以及每次我的应用程序退出时我的数据库都会被调用.
如果你有一些合适的链接,或者一些可以让我知道的知识,我会非常感激!
我正在开发一个针对 Api 19 的应用程序,它基本上是一个处理草图。
我面临的问题是我的应用程序第一次运行时,在安装后,它运行良好,直到用户将其发送到后台。然后,如果他们再次单击应用程序图标,则调用 onCreate() 但活动不会被销毁或重新启动。一些变量会发生变化,从而产生奇怪的行为。
这仅在第一次使用该应用程序时发生。强制关闭它后,这种行为不会再发生(据我测试)。从 Eclipse 启动应用程序时也不会发生这种情况。
总而言之,这是第一次强制关闭后发生的情况(我认为是正确的):
活动正在运行。
活动通过主页按钮返回
暂停()
我们再次点击应用程序图标
onResume()
这就是 - 仅 - 安装后第一次运行应用程序时发生的情况:
活动正在运行。
活动通过主页按钮返回
暂停()
我们再次点击应用程序图标
onCreate() <-- !! 注意没有 onDestroy()
onResume()
我想知道我使用沉浸式模式是否与此有关,但是将 Api 目标版本更改为 10、删除沉浸式模式或在旧设备上进行测试都无济于事。当然,我在清单上使用了android:configChanges="orientation|keyboardHidden|screenSize"。
有没有人知道可能导致这种情况的原因?这是一个常见问题还是我应该在我的代码中查找错误?也许是处理错误?
提前感谢您提供任何线索。我希望这是询问这个问题的正确方式。这是我的第一篇文章。
更新: 我的解释不是很准确,但显然有一个错误报告。这个问题在这里解释得更好:https : //code.google.com/p/android/issues/detail?id=26658
不幸的是,我无法使建议的解决方案起作用,在 onCreate() 中使用它会导致我的应用程序关闭或崩溃:
if (!isTaskRoot()) {
finish();
return;
}
Run Code Online (Sandbox Code Playgroud) 在调试另一个问题时,我意识到我onCreateView的一个活动的方法被调用了两次.我是编程的新手,我不完全理解android在活动加载时如何调用这些方法,但对我来说它似乎不会被调用两次.消除了我的大部分代码,我仍然会看到我的System.out消息两次.
public class AddCourse extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new AddCourseFragment()).commit();
}
}
public static class AddCourseFragment extends Fragment {
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_add_course,
container, false);
System.out.println("I see this TWICE!!!!");
return rootView;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这几乎与我的主要活动实现完全一样,但是那个没有经过onCreateView两次.思考?
我的activity_add_course xml被请求了......
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="horizontal"
android:layout_width="match_parent" …Run Code Online (Sandbox Code Playgroud) 这是android studio在选择3选项卡式布局时自动生成的代码.问题是,当它开始在第一个选项卡,它会调用onCreateView在class PlaceholderFragment.当我切换到第二个选项卡时,它再次为该选项卡调用它.现在问题从返回tab1开始,它不会调用onCreateView.现在,如果我转到tab3,它将被调用该选项卡,然后返回到tab1它现在被调用.因此,onCreateView如果我从tab2转到tab1但是从tab3调到tab1,那么tab1 永远不会被调用.我无法弄清楚为什么它不会仅仅在特定的序列中破坏这个视图.
我没有修改这个自动生成的代码,所以我认为它会正常工作.
public class MainActivity extends ActionBarActivity implements ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
actionBar.addTab(
actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我正在制作适配器以使我的书籍集合在列表视图中可见.

如果我添加super(context,position),问题就解决了:
public BookAdapter(Context context, int position, List <Book> updatedBooksList) {
super(context, position);
this.context = context;
this.booksList = updatedBooksList ;
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道为什么我需要这个参数(int position)并调用超类构造函数?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
另外,从广义上讲,为什么我们总是(?)需要在每个onCreate中调用super.onCreate?
我们不应该覆盖我们所有的活动生命周期阶段 - onPause,onREsume,onStop,OnDestroy,但我们仍然需要在每个阶段调用super?
android oncreate activity-lifecycle android-lifecycle onpause
我有一段代码,我只想在第一次调用特定的OnCreate()方法时运行(每个应用程序会话),而不是每次创建活动时.有没有办法在Android中执行此操作?
我已经创建了OpenGLRenderer.java类并在其中放置了一些代码,显示没有错误.然后我将此代码放在RoomFragment.java片段中创建一个视图:
public class RoomFragment extends Fragment {
/** Called when the fragment is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView view = new GLSurfaceView(this);
view.setRenderer(new OpenGLRenderer());
setContentView(this);
}}
Run Code Online (Sandbox Code Playgroud)
但我得到了
构造函数GLSurfaceView(RoomFragment)未定义
和
对于RoomFragment类型,方法setContentView(RoomFragment)未定义
错误.这些方法不是在头文件中实现的吗?我猜这是因为这不是一个活动,而是一个仅在按钮点击前一个片段(在主活动菜单选择中处于活动状态)时才有效的片段.
我该怎么做?如何在片段层中创建GLSurfaceView?
我在我的应用程序中使用了RatingBar元素,并尝试使用OnRatingChangedListener进行设置.在监听器中,我使用变量上的if语句来做不同的事情.问题是,出于某种原因,当我有多个选项时,这个监听器无法正常工作.它是在onCreate()方法中设置的,在if语句中的变量获取值之前,但我试图将它移动到其他位置而根本没有成功.
我的onCreate():
bar = (RatingBar) findViewById(R.id.serviceLevel);
bar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
if(Code==null){
Toast.makeText(TipCalculatorActivity.this, "Locationing error occured, please report to the developer.", Toast.LENGTH_LONG).show();
}else if(Code=="1"){
if(rating==0){
autochange.setText("Precentage: 0%");
precentage = 0;
calculate(value, precentage);
}else if(rating==0.5){
autochange.setText("Precentage: 10%");
precentage = 8;
calculate(value, precentage);
}else if(rating==1){
autochange.setText("Precentage: 11%");
precentage = 9;
calculate(value, precentage);
}else if(rating==1.5){
autochange.setText("Precentage: 11%");
precentage = 10;
calculate(value, precentage);
}else if(rating==2){
autochange.setText("Precentage: 12%");
precentage = 11;
calculate(value, precentage);
}else if(rating==2.5){
autochange.setText("Precentage: 12%"); …Run Code Online (Sandbox Code Playgroud) 我想知道哪个是第一个静态块或Oncreate方法
public class MainActivity extends Activity {
static{
// dosomething
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)