从片段中获取编辑文本值

Tol*_*lar 5 android android-fragments

我正在使用片段,我在片段中有一个编辑文本,我想在主要活动中获得价值。

\n\n

这是我的片段布局

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"\n    android:layout_width="match_parent"\n    android:layout_height="match_parent"\n    android:orientation="vertical"\n    android:background="#878787" >\n\n        <TextView android:layout_width="fill_parent"\n        android:layout_height="wrap_content"\n        android:gravity="center"\n        android:text="dfgdfgdf"\n        android:textSize="20dp"\n        android:layout_centerInParent="true"\n        android:id="@+id/user_name"/>\n\n    <EditText\n    android:id="@+id/message"\n    android:layout_width="fill_parent"\n    android:layout_height="wrap_content"\n   />\n\n    <Button \n        android:text="G\xc3\xb6nder"\n        android:layout_width="fill_parent"\n        android:layout_height="wrap_content"\n        android:onClick="getFromUser"\n        android:layout_marginTop="40dp"\n        />\n\n</RelativeLayout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用此函数加载片段:

\n\n
public void startChat(JsonObject user) {\n    FrameLayout layout = (FrameLayout)findViewById(R.id.container);\n    layout.setVisibility(View.VISIBLE); \n    Bundle bundle = new Bundle();\n    bundle.putString("name", user.get("name").getAsString());\n    sendTo=user.get("username").getAsString();\n    FragmentManager fragmentManager = getSupportFragmentManager();\n    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();\n    ConversationFragment conv = new ConversationFragment();\n    conv.setArguments(bundle);\n    fragmentTransaction.add(R.id.container, conv);\n    fragmentTransaction.commit();\n    viewPager.setVisibility(View.GONE);\n    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);\n    actionBar.setDisplayHomeAsUpEnabled(true);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的片段类

\n\n
public class ConversationFragment extends Fragment {\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container,\n            Bundle savedInstanceState) {\n        String name = getArguments().getString("name");\n        View rootView = inflater.inflate(R.layout.fragment_conversation, container, false);\n        TextView username=(TextView)rootView.findViewById(R.id.user_name);\n        username.setText(name);\n        return rootView;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,当按下按钮时,主活动运行“getFromUser”函​​数。我想在此函数中获取 edittext 值。我该如何执行此操作?

\n

010*_*101 4

这些事情的程序总是相同的。您无法像这样访问片段的视图。您需要一个回调方法。

将此代码添加到ConversationFragment

private OnGetFromUserClickListener mListener;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnGetFromUserClickListener ) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnGetFromUserClickListener");
    }
}

public void getFromUser(View v) {
    if (mListener != null) {
        EditText edit = (EditText)findViewById(R.id.message);
        mListener.getFromUser(edit.getText().toString());
    }
}

public interface OnGetFromUserClickListener {
    void getFromUser(String message);
}
Run Code Online (Sandbox Code Playgroud)

让您的 MainActivity 实现此接口。将MainActivity 中的getFromUser() 替换为:

public void getFromUser(String message) {
    sendMessage(message);
}
Run Code Online (Sandbox Code Playgroud)

完毕。

编辑:实际上,使用 XML-onClick 属性当前存在错误(请参阅onClick 在 Activity 上调用的片段内):它链接到活动而不是片段。您必须以编程方式设置点击侦听器,以确保代码在将来的某个时刻不会中断。因此,在 XML 中为按钮提供一个 ID(例如 get_from_user),并将以下代码添加到ConversationFragment 内的 onCreateView 中

v.findViewById(R.id.get_from_user).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.get_from_user) {
            getFromUser(v);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

使用此代码可以极大地解耦活动和片段。