gpt4 book ai didi

android - 适配器类中的 super.onActivityResult?安卓

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:27 25 4
gpt4 key购买 nike

我的 RecyclerView 包含非常复杂的项目、多个按钮/图像/文本。为了访问每个按钮/图像,我在适配器类中设置了点击监听器。

但是现在我正在尝试添加设置联系人铃声的功能,但我遇到了问题。

我这样调用 onActivityResult 方法:

Intent contactIntent = new Intent(Intent.ACTION_PICK);
contactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
contactIntent.putExtra("ITEM_POSITION", position);
((Activity) context).startActivityForResult(contactIntent, CONTACT_CHOOSER_ACTIVITY_CODE );

而且效果很好。但问题是:

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

switch (requestCode) {
....
...
...
}
}

我收到此错误:无法解析方法 'onActivityResult(int, int, android.content.Intent)'有什么办法可以避免这种情况吗?或者是否可以在适配器类中使用此方法?如果不是我该怎么办?

最佳答案

你不能在任何 Adapter 类中使用它,这只是 Activity 中的一个方法,每个 extends Activity 的类都可以覆盖这个方法,但肯定不是适配器。

请参阅Overrides在Java中

对于 onActivityResult,请参阅 Activity#onActivityResult(int, int, Intent)

对于像 RecyclerView.Adapter 这样的东西,您需要在您的适配器中定义一个接口(interface)并在您的 Activity 中实现该接口(interface)。

例如,这里是一个应用程序的代码,它将点击的项目及其位置的字符串发送到显示它的新 Activity:

主要 Activity :

public class MainActivity extends AppCompatActivity implements MyAdapter.CallbackInterface {


private static final int MY_REQUEST = 1001;

private static final String [] ITEMS = {"Item 1", "Item 2", "Item 3" ,"Item 4", "Item 5", "Item 6"};

private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// ... Adapter setup, simple LinearLayoutManager and String [] used
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rec_view);
myAdapter = new MyAdapter(this, ITEMS);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(myAdapter);
}

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

case RESULT_OK:

// ... Check for some data from the intent
if(requestCode == MY_REQUEST){
// .. lets toast again
int position = -1;
if(data != null){
position = data.getIntExtra("Position", 0);
}

if(position != -1) {
Toast.makeText(this, "Handled the result successfully at position " + position, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "Failed to get data from intent" , Toast.LENGTH_SHORT).show();
}
}

break;

case RESULT_CANCELED:

// ... Handle this situation
break;
}
}

/**
* Interface Method which communicates to the Acitivty here from the {@link MyAdapter}
* @param position - the position
* @param text - the text to pass back
*/
@Override
public void onHandleSelection(int position, String text) {

Toast.makeText(this, "Selected item in list "+ position + " with text "+ text, Toast.LENGTH_SHORT).show();

// ... Start a new Activity here and pass the values
Intent secondActivity = new Intent(MainActivity.this, DetailActivity.class);
secondActivity.putExtra("Text",text);
secondActivity.putExtra("Position", position);
startActivityForResult(secondActivity, MY_REQUEST);
}
}

MainActivity 的 xml:

<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.divshark.recyclerviewsimpledemo.MainActivity">

<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rec_view" />
</RelativeLayout>

我的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>{

private CallbackInterface mCallback;
private String [] mMyItems;
private Context mContext;

public interface CallbackInterface{

/**
* Callback invoked when clicked
* @param position - the position
* @param text - the text to pass back
*/
void onHandleSelection(int position, String text);
}

public MyAdapter(Context context, String [] myItems){

mContext = context;
mMyItems = myItems;

// .. Attach the interface
try{
mCallback = (CallbackInterface) context;
}catch(ClassCastException ex){
//.. should log the error or throw and exception
Log.e("MyAdapter","Must implement the CallbackInterface in the Activity", ex);
}
}

@Override
public int getItemCount() {
return mMyItems.length;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public void onBindViewHolder(MyHolder holder, final int position) {

// Set the text for the View
holder.mTextView.setText(mMyItems[position]);

// Use your listener to pass back the data
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mCallback != null){
mCallback.onHandleSelection(position, mMyItems[position]);
}
}
});
}

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
return new MyHolder(view);
}

static class MyHolder extends RecyclerView.ViewHolder{

TextView mTextView;

public MyHolder(View itemView) {
super(itemView);

mTextView = (TextView) itemView.findViewById(R.id.tv_list_item);
}
}
}

适配器的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="?listPreferredItemHeight">

<TextView
android:id="@+id/tv_list_item"
android:textColor="@android:color/black"
tools:text="Some Text Holder"
android:layout_marginLeft="16dp"
android:textSize="18sp"
android:layout_centerVertical="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>

和 DetailActivity:

public class DetailActivity extends AppCompatActivity {

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

TextView textView = (TextView) findViewById(R.id.tv_detail_text);

if(getIntent() != null && getIntent().getExtras() != null) {
Bundle extras = getIntent().getExtras();
String text = extras.getString("Text");
int position = extras.getInt("Position");

textView.setText(String.format("%s at position %d", text, position));

// .. For this purpose set result okay and use position as part of data when Activity finishes
// Which will in turn invoke the onActivityResult method in the calling activity
Intent resultIntent = new Intent();
resultIntent.putExtra("Position", position);
setResult(RESULT_OK, resultIntent);
}
}
}

Detail Activity 的布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">


<TextView
android:id="@+id/tv_detail_text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>

祝你好运,编码愉快!

关于android - 适配器类中的 super.onActivityResult?安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com