【问题标题】:Get value on another activity put in Edit text of list view of another activity在另一个活动的列表视图的编辑文本中获取另一个活动的价值
【发布时间】:2020-03-11 12:56:05
【问题描述】:

MainActivitymp3 中有带有 Edittext 的列表视图。我希望当我长按每个编辑文本时,会显示新的 MainActivitysentencerecording 然后单击关闭按钮后,此(5)上的值将放入 MainActivitymp3。 这是 MainActivitymp3 活动的 MycustomerAdater 类

public class MyCustomAdapter extends BaseAdapter {
HashMap<String, String> newupdatelist = new HashMap<String, String>();
public Context context;

public static ArrayList<Song> listsong;
private DatabaseSQL datab;
private final String TAG = getClass().getSimpleName();

public MyCustomAdapter(Context context, ArrayList<Song> objects) {
    this.context=context;
    this.listsong=objects;
}
...
 public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if(convertView==null){
        convertView = LayoutInflater.from(context).inflate(R.layout.song_items,parent,false);
        viewHolder = new ViewHolder();
        viewHolder.tenbai = (TextView) convertView.findViewById( R.id.text);
        viewHolder.delaytime = (EditText) convertView.findViewById(R.id.delay);
        viewHolder.timeunit = (TextView) convertView.findViewById(R.id.timeunit);
        convertView.setTag(viewHolder);
    }
    else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    Song infor = listsong.get(position);
    viewHolder.tenbai.setText(infor.getTenbai());
    viewHolder.timeunit.setText(infor.getTimeunit());
    viewHolder.delaytime.setText(infor.getDelaytime());


    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (context instanceof MainActivitymp3) {
                //play selection song
 ((MainActivitymp3)context).playMedia(listsong.get(position).getDuongdan().toString());
            }

        }
    });
    viewHolder.delaytime.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
  // update new value from edittext to listsong array
         listsong.get(position).setDelaytime(viewHolder.delaytime.getText().toString() );
         }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void afterTextChanged(Editable s) {

        }
    });
    viewHolder.delaytime.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            Toast.makeText(context, "vi tri"+ position, Toast.LENGTH_LONG).show();
            Intent intend = new Intent(context, MainActivitysentencerecording.class);
            Activity origin = (Activity)context;
            origin.startActivityForResult(intend, 200);
       // Deleted these below lines as @David Wasser answered
          //int x=  ((MainActivitymp3)context).gio;
           // viewHolder.delaytime.setText(String.valueOf( x ));

            return true;
    });      
    return convertView;
   }

public class ViewHolder{
    TextView tenbai;
    EditText delaytime;
    TextView timeunit;
 }
 }

这是 MainActivitymp3 类

public class MainActivitymp3 extends AppCompatActivity {
  ...
 public  int gio;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    ( new MyCustomAdapter( this, fileNames )).onActivityResult(requestCode, resultCode, data);
    if(resultCode == Activity.RESULT_OK){
        if(requestCode == 200){
            // here comes the data from activity
            gio = data.getIntExtra("timedelaysetting",0);
            Log.d("MyAdapter", "onActivityResult  "+gio);

        }
    }
}

这里是 MainActivitysentencerecording 活动

public class MainActivitysentencerecording extends AppCompatActivity {
 ...
//close button click
 Intent resultIntent = new Intent();
            resultIntent.putExtra("timedelaysetting", sec);
            setResult( Activity.RESULT_OK, resultIntent);
            finish();
}

请帮忙解决这个问题。我正在寻找您的来信。谢谢

【问题讨论】:

  • 您还可以传递包含在适配器中的长按编辑文本的行索引,然后用于查找行
  • 对不起!你能输入一些带有代码的单词来回答吗?我不明白你的意思
  • 使用事件总线库将数据从应用程序的任何地方传递到任何地方。! greenrobot.org/eventbus
  • @onur taskin。它对我有用。我得到行的值和索引,然后更新 MyCustomAdapter 的数组列表。之后 Listview 设置为新的 MyCustomAdapter 。谢谢您的建议。 :)

标签: android android-intent android-activity android-listview onactivityresult


【解决方案1】:

您似乎不明白如何从另一个启动Activity。在您的 longclick 侦听器中,您有以下代码:

origin.startActivityForResult(intend, 200);
int x=  ((MainActivitymp3)context).gio;
viewHolder.delaytime.setText(String.valueOf( x ));

这意味着您认为,当您调用 startActivityForResult() 时,控制权会立即传递给 MainActivitysentencerecording,并且下一行代码 (int x= ((MainActivitymp3)context).gio;) 仅在 MainActivitysentencerecording 完成并完成后执行。

这不是它的工作原理。当您调用startActivityForResult() 时,您只是要求Android 框架在Android 框架重新获得控制权时启动目标Activity(在本例中为MainActivitysentencerecording。接下来的几行代码在调用startActivityForResult() 之后立即执行,然后MainActivitysentencerecording 甚至被启动并显示给用户。

您只需在调用startActivityForResult() 后只需return,Android 框架就会重新获得控制权并启动MainActivitysentencerecording。当Activity 完成时,Android 框架将调用MainActivitymp3.onActivityResult()。这是异步发生的,而且比你想象的要晚得多。您只能在调用onActivityResult() 之后更新您的 UI。

【讨论】:

  • Waseer 谢谢你的课。你说的对 。我停止使用 int x= ((MainActivitymp3)context).gio; viewHolder.delaytime.setText(String.valueOf(x));如你所说。但是我不明白你提到的方法 MainActivitymp3.onActivityResult() 。你能帮我更多更详细的吗?非常感谢您的帮助
  • 请在网上搜索有关如何使用startActivityForResult() 的教程。我无法在答案中向您解释,这不是 Stackoverflow 的用途。
猜你喜欢
  • 2017-10-21
  • 2015-12-25
  • 1970-01-01
  • 2013-02-07
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多