0

Api レベル 8 から使用Content Providerしたいと考えています。Content Observerこれを Api-15 (ICS) で作成できます。しかし、私は自分のアプリを Api-8 からサポートする必要があります。

このように android:minSdkVersion="8" に言及すると、このエラーが発生し Class requires API level 11 (current min is 8): android.content.Loaderます。

import android.app.ListActivity;
import android.content.ContentValues;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.EditText;

public class TodosOverviewActivity extends ListActivity implements     LoaderManager.LoaderCallbacks<Cursor> {

private static final int DELETE_ID = Menu.FIRST + 1;     
private ConverstationsAdapter adapter;
private EditText Enter_Text; 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.todo_list);
    this.getListView().setDividerHeight(2);
    fillData();
    registerForContextMenu(getListView());
    Enter_Text = (EditText) findViewById(R.id.msg);

    findViewById(R.id.send_button).setOnClickListener(new OnClickListener() {           
        @Override
        public void onClick(View v) {   
            SendInfo();
        }
    });
}

private void SendInfo() {

    String msg = Enter_Text.getText().toString().trim();
    ContentValues values = new ContentValues();
    values.put(TodoTable.COLUMN_RECEIVER, "Reddy");
    values.put(TodoTable.COLUMN_SENDER, "RA");
    values.put(TodoTable.COLUMN_MSG, msg);

    getContentResolver().insert(MyTodoContentProvider.CONTENT_URI, values);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case DELETE_ID:
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        Uri uri = Uri.parse(MyTodoContentProvider.CONTENT_URI + "/" + info.id);
        getContentResolver().delete(uri, null, null);
        fillData();
        return true;
    }
    return super.onContextItemSelected(item);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
}

private void fillData() {  
    getLoaderManager().initLoader(0, null, this);   // error here   
    adapter = new ConverstationsAdapter(TodosOverviewActivity.this, null );
    setListAdapter(adapter);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}

// Creates a new loader after the initLoader () call
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { TodoTable.COLUMN_ID, TodoTable.COLUMN_MSG };
    CursorLoader cursorLoader = new CursorLoader(this,
            MyTodoContentProvider.CONTENT_URI, projection, null, null, null);
    return cursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    adapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    // data is not available anymore, delete reference
    adapter.swapCursor(null);
}
}
4

2 に答える 2

0

使用を検討してくださいandroid.support.v4.content.Loader

編集

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;

...

public class YourClass implements LoaderManager.LoaderCallbacks<Cursor> ...
...

@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { TodoTable.COLUMN_ID, TodoTable.COLUMN_MSG };
    CursorLoader cursorLoader = new CursorLoader(this,
        MyTodoContentProvider.CONTENT_URI, projection, null, null, null);
    return cursorLoader;
}

LoaderManager.LoaderCallbacks< Cursor >に注意してください


編集
とにかく、このCursorLoader チュートリアルを読んでください。


編集
フラグメントを使用してアクティビティを書き換えます(有線バージョン):

パッケージ de.vogella.android.todos;

import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.widget.EditText;

public class TodosOverviewActivity extends FragmentActivity {

public static class TodosOverviewListFragment extends ListFragment
        implements LoaderManager.LoaderCallbacks<Cursor> {
    private ConverstationsAdapter adapter;
    private EditText Enter_Text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(0, null, this);
        adapter = new ConverstationsAdapter(getActivity(), null);
        setListAdapter(adapter);
    }

    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        String[] projection = { TodoTable.COLUMN_ID, TodoTable.COLUMN_MSG };
        CursorLoader cursorLoader = new CursorLoader(getActivity(),
                MyTodoContentProvider.CONTENT_URI, projection, null, null,
                null);
        return cursorLoader;
    }

    public void onLoadFinished(Loader<Cursor> arg0, Cursor data) {
        adapter.swapCursor(data);
    }

    public void onLoaderReset(Loader<Cursor> arg0) {
        adapter.swapCursor(null);
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();
    TodosOverviewListFragment fragment = new TodosOverviewListFragment();
    fragmentTransaction.add(fragment, "xx");
    fragmentTransaction.commit();
}
}

マニフェスト: uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"


プロジェクトにサポート パッケージを追加します (プロジェクト -> Android ツール)。

于 2012-10-06T08:06:15.977 に答える
0

contentobserverとの両方contentproviderがapi 8に存在するため、問題なく使用できます。あなたのエラーを見て、あなたは使用しようとしていますLoaderAsyncTaskLoader を使用する代わりに、doinbackground でカーソルの読み込みを安全に使用および実行できます。ローダーは API 11 で導入されました

したがって、 android.content.Loader の使用を削除すると、ビルドできるはずです

于 2012-10-06T07:19:38.120 に答える