Android 无法使用加载程序回调方法检索联系人
我正在构建一个简单的应用程序,我想从手机中检索所有联系人,并将其显示在文本视图中。使用加载程序回调方法进行相同的操作,但按下加载按钮后会出现一个空白屏幕。还提供了相同的读写权限。在下面发布我的代码,请帮助。 提前谢谢 MainActivity.javaAndroid 无法使用加载程序回调方法检索联系人,android,android-loader,Android,Android Loader,我正在构建一个简单的应用程序,我想从手机中检索所有联系人,并将其显示在文本视图中。使用加载程序回调方法进行相同的操作,但按下加载按钮后会出现一个空白屏幕。还提供了相同的读写权限。在下面发布我的代码,请帮助。 提前谢谢 MainActivity.java package com.example.sumeet.contentproviderdemoyoutube; import android.app.LoaderManager; import android.content.CursorLoad
package com.example.sumeet.contentproviderdemoyoutube;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, LoaderManager.LoaderCallbacks<Cursor> {
TextView textView;
Button button;
String TAG = "Show";
private String mColumnProjection[] = new String[]{
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.CONTACT_STATUS,
ContactsContract.Contacts.HAS_PHONE_NUMBER};
private String mSelectionClause = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + "='Simpi'";
private String[] mSelectionArguments = new String[]{"Simpi"};
private String mOrderBy = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv_show);
button = (Button) findViewById(R.id.load);
// ContentResolver contentResolver = getContentResolver();
// Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
// mColumnProjection,
// mSelectionClause,
// null,
// null);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.load:
getLoaderManager().initLoader(1, null, this);
Toast.makeText(this, "Button Clicked", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
if (i == 1) {
Toast.makeText(this, "Inside onloader", Toast.LENGTH_SHORT).show();
return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
Toast.makeText(this, "OnFinish", Toast.LENGTH_SHORT).show();
if (cursor != null && cursor.getCount() > 0) {
StringBuilder stringBuilder = new StringBuilder("");
while (cursor.moveToNext()) {
stringBuilder.append(cursor.getString(0) + "," + cursor.getString(1) + "," + cursor.getString(2) + "\n");
}
textView.setText(stringBuilder.toString());
} else {
textView.setText("No Contacts to display");
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
Toast.makeText(this, "onLoader", Toast.LENGTH_SHORT).show();
}
}
package com.example.sumeet.contentproviderdemoyoutube;
导入android.app.LoaderManager;
导入android.content.CursorLoader;
导入android.content.Loader;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.provider.contacts合同;
导入android.support.v7.app.AppActivity;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
公共类MainActivity扩展AppCompatActivity实现View.OnClickListener、LoaderManager.LoaderCallbacks{
文本视图文本视图;
按钮;
String TAG=“Show”;
私有字符串mColumnProjection[]=新字符串[]{
Contacts contract.Contacts.DISPLAY\u NAME\u PRIMARY,
Contacts contract.Contacts.CONTACT\u状态,
Contacts contract.Contacts.HAS_PHONE_NUMBER};
私有字符串mSelectionClause=ContactsContract.Contacts.DISPLAY_NAME_PRIMARY+“='Simpi';
私有字符串[]mSelectionArguments=新字符串[]{“Simpi”};
私有字符串mOrderBy=Contacts contract.Contacts.DISPLAY\u NAME\u PRIMARY;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(textView)findViewById(R.id.tv_show);
按钮=(按钮)findViewById(R.id.load);
//ContentResolver ContentResolver=getContentResolver();
//Cursor Cursor=contentResolver.query(ContactsContract.Contacts.CONTENT\u URI,
//麦克伦投影,
//选择条款,
//空,
//无效);
}
公共void onClick(视图){
开关(view.getId()){
案例R.id.荷载:
getLoaderManager().initLoader(1,null,this);
Toast.makeText(此“按钮已点击”,Toast.LENGTH_SHORT).show();
打破
违约:
打破
}
}
@凌驾
公共加载器onCreateLoader(inti,Bundle){
如果(i==1){
Toast.makeText(这是“内部onloader”,Toast.LENGTH_SHORT.show();
返回新的游标加载程序(此,ContactsContract.Contacts.CONTENT\u URI,null,null,null);
}
返回null;
}
@凌驾
public void onLoadFinished(加载器,光标){
Toast.makeText(这是“OnFinish”,Toast.LENGTH_SHORT).show();
if(cursor!=null&&cursor.getCount()>0){
StringBuilder StringBuilder=新StringBuilder(“”);
while(cursor.moveToNext()){
stringBuilder.append(cursor.getString(0)+“,“+cursor.getString(1)+”,“+cursor.getString(2)+”\n”);
}
textView.setText(stringBuilder.toString());
}否则{
setText(“没有要显示的联系人”);
}
}
@凌驾
公共void onLoaderReset(加载器){
Toast.makeText(这是“onLoader”,Toast.LENGTH_SHORT).show();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.sumeet.contentproviderdemoyoutube.MainActivity">
<Button
android:id="@+id/load"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Load" />
<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sumeet.contentproviderdemoyoutube">
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
将
onClick()中的init loader调用更改为
getLoaderManager().initLoader(1, null, this).forceLoad();
还声明
Blockquote必须通过CursorLoader(Context,Uri,String[],String,String[],String)
或使用CursorLoader(Context)
创建一个空实例,并使用setUri(Uri)
,setSelection填充所需的参数来构建游标Loader以执行查询(字符串)
,setSelectionArgs(String[])
,setSortOrder(String)
,以及setProjection(String[])
尝试向CursorLoader构造函数提供此信息当您在onLoadFinished()中设置断点时,您的sdk版本和设备型号是什么
method并逐步浏览您的代码,您看到了什么?您好,我正在使用手机运行此应用程序。Lenovo Vibe k5、Android 5.1.1、API22@CommonsWare我在文本视图中没有得到任何输出。我甚至不确定是否调用了onLoadFinished()作为他们的输出,也没有错误。仍然一样。