【问题标题】:Is there a method like setResult() in fragment?片段中是否有类似 setResult() 的方法?
【发布时间】:2016-07-29 11:53:22
【问题描述】:

我正在使用片段。我在 onResult() 方法中遇到错误。我需要一个可以在我的片段中使用的setResult(RESULT_OK, data) 的替代方法。请帮忙。

日历片段:

package app.pal.study.samplestudy;

import android.app.Fragment;
import android.content .Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.util.Date;
import java.util.List;

public class CalendarFragment  extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_calendar, container, false);
    return rootView;
}


@Override
public void onResume() {
    super.onResume();
    refresh();
}

private void refresh() {
    CalendarEventDataSource dataSource = new CalendarEventDataSource(getActivity());
    dataSource.openReadOnlyDB();
    final List<CalendarEvent> calendarEvents = dataSource.getAllEvents();
    dataSource.close();
    CalAllEventsListAdapter adapter = new CalAllEventsListAdapter(calendarEvents);
    ListView listView = (ListView) getView().findViewById(R.id.all_event_list);
    listView.setAdapter(adapter);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        end();
        return true;
    }
    return super.onOptionsItemSelected(item);
}



public void onBackPressed() {
    end();
}

private void end() {
    Intent data = new Intent();
    data.putExtra(Constants.DATE_KEY, (Date)(getArguments().get(Constants.DATE_KEY)));
    setResult(RESULT_OK, data);
  }
}

【问题讨论】:

  • 错误是什么..?
  • setResult 用于 startActivityForResult 调用的活动。您应该使用接口回调。
  • @AbhishekPatel 错误:(58, 19) 错误:找不到符号变量 RESULT_OK
  • 我认为正确的是使用回调接口和 setResult(RESULT_OK, data);在您的嵌套活动中。关于回调你可以在这里阅读android developers guide
  • @Nanoc 我如何使用接口回调?

标签: java android android-fragments


【解决方案1】:

你应该在你的片段拥有活动中调用它:

 getActivity().setResult(Activity.RESULT_OK, data) 

您可能还想完成您的活动:

 getActivity().finish();

【讨论】:

  • throws an error - 你是什么意思?编译器可以显示错误,这是在编译期间。执行过程中可能会抛出异常 - 然后您应该查看 logcat 中的调用堆栈。
  • 当你开始你的活动片段时也可以使用 startActivityForResult
  • @PersianBlue 我已更新使用:Activity.RESULT_OK,这可能导致编译错误
  • 现在使用 requireActivity() 代替 getActivity() 方法来调用 Activity 方法。
【解决方案2】:

如果你从另一个片段开始你的片段。

你需要使用:

/**
 * Optional target for this fragment.  This may be used, for example,
 * if this fragment is being started by another, and when done wants to
 * give a result back to the first.  The target set here is retained
 * across instances via {@link FragmentManager#putFragment
 * FragmentManager.putFragment()}.
 *
 * @param fragment The fragment that is the target of this one.
 * @param requestCode Optional request code, for convenience if you
 * are going to call back with {@link #onActivityResult(int, int, Intent)}.
 */

public void setTargetFragment(Fragment fragment, int requestCode) {
}

在启动 Fragment 时。

像这样:

Fragment newFragment = new YourFragment();
newFragment .setTargetFragment(this, SOME_REQUEST_INT);

然后,在 YourFragment

Intent data = new Intent();
data.putExtra(Constants.DATE_KEY, (Date)(getArguments().get(Constants.DATE_KEY)));
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);

或者

getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);

【讨论】:

  • 这是从片段到片段传递结果的正确方法!
【解决方案3】:

使用它可能对你有帮助..

getActivity().setResult(Activity.RESULT_OK, data);

【讨论】:

    【解决方案4】:

    使用

    getActivity().setResult(Activity.RESULT_OK, data);
    

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多