【问题标题】:How do I retrieve data automatically on app start up through parse?如何在应用程序启动时通过解析自动检索数据?
【发布时间】:2015-04-16 13:38:13
【问题描述】:

目前我只能在单击刷新按钮时检索数据。

如何让它在每次启动应用程序时,甚至每次在页面之间切换时自动从解析中检索数据? 谢谢。

相关代码:

public class MyActivity extends ActionBarActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {

  String eventTxt;
  EditText seteditTxt;
  ParseObject Events = new ParseObject("Events");

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

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));

    seteditTxt = (EditText) findViewById(R.id.seteditTxt);
    updatelocalData();
    updateData();
}

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    seteditTxt = (EditText) findViewById(R.id.seteditTxt);
    int id = item.getItemId();

    if (id == R.id.action_refresh) {
      updatelocalData();
      updateData();
    }

    if (id == R.id.action_example) {
      eventTxt = seteditTxt.getText().toString();
      Events.put("EventName", eventTxt);
      Events.saveEventually(new SaveCallback() {
        public void done(ParseException e) {
          if (e == null) {
            // Saved successfully.
            Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show();
          } else {
            // The save failed.
            Toast.makeText(getApplicationContext(), "Failed to Save", Toast.LENGTH_SHORT).show();
          }
        }
      });
      Events.pinInBackground();
    }
    return super.onOptionsItemSelected(item);
  }

  public void updateData() {
    ParseQuery < ParseObject > query = ParseQuery.getQuery("Events");
    query.getInBackground("d51GM3syxp", new GetCallback < ParseObject > () {
      public void done(ParseObject Events, ParseException e) {
        if (e == null) {
          String Txt = Events.getString("EventName");
          seteditTxt.setText(Txt);
        } else {
          // something went wrong
          System.out.print("Error in parse retrieving");
        }
      }
    });
  }

  public void updatelocalData() {
    ParseQuery < ParseObject > query = ParseQuery.getQuery("Events");
    query.fromLocalDatastore();
    query.getInBackground("d51GM3syxp", new GetCallback < ParseObject > () {
      public void done(ParseObject Events, ParseException e) {
        if (e == null) {
          String Txt = Events.getString("EventName");
          seteditTxt.setText(Txt);
        } else {
          // something went wrong
          System.out.print("Error in locally retrieving");
        }
      }
    });
  }
}

当我添加时:

seteditTxt = (EditText) findViewById(R.id.seteditTxt); 
updatelocalData(); 
updateData(); 

在我的 onCreate() 中,它在 seteditTxt 的第一个 updatelocalData() 方法中给了我一个错误,说: 尝试在空对象引用上调用虚拟方法 'void android.widget.EditText.setText(java.lang.CharSequence)' -

activity_my.xml 文件:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:context=".MyActivity"  android:background="@drawable/background">

    <RelativeLayout android:id="@+id/container" android:layout_width="match_parent"
        android:layout_height="match_parent">

    </RelativeLayout>

    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.mycompany.e_planner.NavigationDrawerFragment"
        tools:layout="@layout/fragment_navigation_drawer" />

</android.support.v4.widget.DrawerLayout>

片段xml文件:

<RelativeLayout 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" tools:context="com.mycompany.e_planner.Calendar1"
android:background="#7dffe7f5">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:inputType="textMultiLine"
            android:ems="10"
            android:id="@+id/seteditTxt"
            android:layout_gravity="bottom"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:background="#7dfff6ec"
            android:autoText="false"
            android:text=" " />

</RelativeLayout>

【问题讨论】:

  • 有一个基本活动并编写你的逻辑,所以当你在活动之间导航时,它会从解析加载内容
  • 谢谢。基础活动如?数据显示在片段上 - 这是主活动。 @HarshaVardhan
  • 很好。你仍然可以创建基础片段和片段的开始调用基础活动的方法
  • 当我将它放在 onCreate 中时,它在我的更新方法中出现错误,提示尝试在空对象上调用虚拟方法 'void android.widget.EditText.setText(java.lang.CharSequence)'参考——
  • 添加activity_my.xml文件

标签: java android parse-platform database-backups oncreate


【解决方案1】:

只需移动相关方法,我想这些:

  updatelocalData();
  updateData();

根据您的需要发送至 Activity 的 onCreate()onStart()onResume()。 如果您在 onCreate() 中执行此操作,请确保所有 UI 元素(包括 EditText seteditTxt)都已初始化方法所依赖的。

【讨论】:

  • 当我添加: seteditTxt = (EditText) findViewById(R.id.seteditTxt);更新本地数据();更新数据();在我的 onCreate() 中,它在 seteditTxt 的第一个 updatelocalData() 方法中给了我一个错误,说:尝试在空对象引用上调用虚拟方法 'void android.widget.EditText.setText(java.lang.CharSequence)'跨度>
  • 可以贴一下 onCreate 的代码吗?你也可以尝试调用 onStart 中的方法
  • 好吧,基本上你无法从你的活动中找到片段的 EditText。该菜单有效,因为当您单击刷新时,片段布局已经附加到活动的。但这是错误和危险的。您应该使用侦听器或 EventBus/Otto 在 Activity 和 Fragment 之间进行通信。
  • 哦,好的,谢谢。我不确定听众会如何工作。我尝试在我的片段活动中检索 - 但由于某种原因,它无法解析 findViewById(R.id.seteditTxt) 部分中的“findbyView”。
  • 解决了!我改为从片段文件中检索。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2011-08-29
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2018-03-01
相关资源
最近更新 更多