从片段中获取edittext值

时间:2014-08-05 08:47:40

标签: android android-fragments

我正在使用片段,我在片段中有一个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;
    }
}

正如您所看到的那样,按下按钮主要活动运行&#34; getFromUser&#34; function.I想在这个函数中获取edittext值。我该怎么做?

3 个答案:

答案 0 :(得分:4)

有两个approches

  1. 使用getActivity()方法
  2. 在您的片段中,您可以调用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. 使用接口
    2. 创建界面。实施是在容器活动上。将其引用传递给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();
              }
          }
      

答案 1 :(得分: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);
}

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

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

完成。

编辑: 实际上,使用XML-onClick属性目前存在漏洞(请参阅onClick inside fragment called on 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);
        }
    }
});

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

答案 2 :(得分:0)

我解决了这个问题。

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值。