繁体   English   中英

从片段中获取edittext值

[英]Get edittext value from fragment

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

这是我的片段布局

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

        <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="dfgdfgdf"
        android:textSize="20dp"
        android:layout_centerInParent="true"
        android:id="@+id/user_name"/>

    <EditText
    android:id="@+id/message"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
   />

    <Button 
        android:text="Gönder"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="getFromUser"
        android:layout_marginTop="40dp"
        />

</RelativeLayout>

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

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

}

这是我的片段类

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

正如您所看到的那样按下按钮主活动运行“getFromUser”函​​数。我想在此函数中获取edittext值。我该怎么做?

有两个approches

  1. 使用getActivity()方法

在您的片段中,您可以调用getActivity()。 这将使您可以访问创建片段的活动。 从那里你可以明显地调用活动中的任何类型的访问器方法。

class ParentActivity extends Activity
{
   public void callFromFragment()
   {
       // Your business logic
   }
}

class ChildFragment extends Fragment
{
    public void callingMethod()
    {
       // This is how you call method of Activity from Fragment.
       ((ParentActivity)getActivity()).callFromFragment();
    }
}
  1. 使用接口

创建界面。 实施是在容器活动上。 将其引用传递给Fragment。 从Fragment调用接口的方法。

public interface Mediator {
        public void callFromFragment();
    }

    class ParentActivity extends Activity implements Mediator
    {

        private void someMethod()
        {
            ChildFragment fragment=new ChildFragment();
            fragment.setMediator(this);
            // Fragmet Transaction lofi
        }
        @Override
        public void callFromFragment()
        {

        }
    }

    class ChildFragment extends Fragment
    {
        Mediator mediator;

        public Mediator getMediator() {
            return mediator;
        }

        public void setMediator(Mediator mediator) {
            this.mediator = mediator;
        }

        public void callingMethod()
        {
           // This is how you call method of Activity from Fragment.
            mediator.callFromFragment();
        }
    }

对于这些事情,它始终是相同的程序。 您无法像这样访问片段的视图。 你需要一个回调方法。

将此代码添加到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);
}

使您的MainActivity实现此界面。 MainActivity中的 getFromUser()替换为:

public void getFromUser(String message) {
    sendMessage(message);
}

完成。

编辑:实际上,使用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);
        }
    }
});

使用此代码可以极大地将活动和片段相互分离。

我解决了这个问题。

public void getFromUser(View view) {        
    ConversationFragment fragment1 = (ConversationFragment)getSupportFragmentManager().findFragmentById(R.id.container);
    View frag=fragment1.getView();
    EditText editText1 =(EditText) frag.findViewById(R.id.message);
    String message=editText1.getText().toString();
    sendMessage(message);
}

现在我可以从fragment获取edittext值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM