【问题标题】:Sending data from Activity to Fragment with Interface使用接口将数据从 Activity 发送到 Fragment
【发布时间】:2015-05-15 00:37:51
【问题描述】:

我正在开发一个应用程序,我在下面添加了图片来演示我的问题。当我单击主要活动上的星形按钮时,第二个活动打开。在第二个活动中,我有列表视图,当我单击列表视图项目时,我想将第二个活动的值发送到片段。我可以用接口在两个片段之间做这些事情,但我不能用接口做这个问题。当我在第二个活动中声明接口时,我得到 CastExxcceptionError。

我该怎么做?我也尝试过捆绑,但它也让我出错。

不知道怎么办?

提前感谢您分享经验。

PS:我在下面添加了代码。第一步工作得很好。只有第二步没有按我的意愿工作

MainActivity

public class MainActivity extends ActionBarActivity {

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


@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
    if (id == R.id.action_settings) {
        Intent i = new Intent(MainActivity.this,SecondActivity.class);
        startActivity(i);
    }
    return super.onOptionsItemSelected(item);
}
}

第二活动

public class SecondActivity extends Activity {
ListView lv;
ArrayList<String> al = new ArrayList<>();
FragmentActivity fragmentActivity = new FragmentActivity();
FragmentActivity newFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);
    lv = (ListView) findViewById(R.id.listView);
    al.add("District");
    al.add("Parcel");
    al.add("Satellite");
    al.add("Mosaic");
    al.add("Hybrid");
    al.add("Building");
    al.add("Road");
    al.add("Door");
    al.add("Cat");
    al.add("Dog");
    al.add("Bird");
    al.add("Weather");
    al.add("Heaven");
    al.add("Paradise");
    al.add("Super");
    al.add("Wonderful");
    al.add("Great");
    al.add("Thanks");
    al.add("For");
    al.add("Helpings");
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al);
    lv.setAdapter(arrayAdapter);

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         fragmentActivity.Response(al.get(position));

        }
    });


}

}

片段活动

public class FragmentActivity extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_layout,container,false);
    return v;

}
public void Response(String data){
    Toast.makeText(getActivity(),data,Toast.LENGTH_SHORT).show();
}
}

【问题讨论】:

  • 哪一行导致了错误?
  • @IntegralOfTan fragmentActivity.Response(al.get(position)); SecondActivity 这行给我错误。
  • 尝试用 getActivity.getApplicationContext() 替换 getActivity()
  • 给我 nullpointerexception 错误。同一行。
  • 在调试模式下运行您的代码以找出哪个变量为空

标签: android android-fragments interface


【解决方案1】:

您使用活动只是为了创建(和显示)元素列表。您不能为此使用DialogFragment 吗?

这样,很容易进行过渡并获得结果。完整的例子可以在here找到(未测试,但我想你可以很容易地在互联网上找到这种资源)。

【讨论】:

    【解决方案2】:

    使用startActivityForResult 从第一个活动开始呼叫您第二个活动。

    onListItemClick 的第二个活动中创建Intent,其中包含您需要的数据作为extras 并调用setResult,将Intent 作为参数传递,finish() 第二个活动。

    在第一个活动中,您将在OnActivityResult 中获得此 Intent。

    【讨论】:

    • 感谢@Alex 的评论,我可以在 onoptionsmenuitemclick 或按钮单击中使用 startactivityforresult 吗?
    • 当然可以,从 Activity 或 Fragment 中的任何地方都可以。但是,如果来自内部类,则使用 YourActivity.this 而不仅仅是 this。
    • 当我尝试在按钮内添加 startActivityForResult 时无法解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多