【问题标题】:Get edittext value from fragment从片段中获取edittext值
【发布时间】:2014-08-06 14:58:20
【问题描述】:

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

这是我的片段布局

<?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 值。我该怎么做?

【问题讨论】:

  • “主要活动运行“getFromUser”函​​数”如果你说那是你的片段布局没有任何意义。你的意思是 getFromUser 在片段内部被调用?
  • @Vlad 是的,我的意思是当用户按下按钮时,getFromUser 函数运行,并且这个函数在 mainactivity 中声明。
  • 这正是我想的行不通的。该方法永远不会在按钮单击时调用...
  • 你能发一下你的mainactivity
  • 这里完整的主要活动:pastebin.com/WQHgeCdZ

标签: android android-fragments


【解决方案1】:

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

将此代码添加到 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 实现这个接口。将 getFromUser() inside MainActivity 替换为:

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

完成。

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

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);
        }
    }
});

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

【讨论】:

  • 正如我所说,让你的活动实现 OnGetFromUserClickListener。
  • 我不明白如何在主要活动中实现此代码。你能看看这个吗? pastebin.com/WQHgeCdZ
  • 以上的都一一做?不要忘记在“implements ActionBar.TabListener”后面加上“, ConversationFragment.OnGetFromUserClickListener”。
  • 我喜欢这样:主要活动:pastebin.com/BuZeK5je 这是片段:pastebin.com/0jaMrPw1 但我的应用程序崩溃了这是错误日志:prntscr.com/49syle
  • 像现在这样(使用 setArguments 和 getArguments)是最佳实践。如果您确实必须在片段已显示时对其进行更新,您可以调用 getSupportFragmentManager().findFragmentById(...) 或将片段保存在变量中。 Stack Overflow 上有足够的信息。
【解决方案2】:

有两种方法

  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();
        }
    }

【讨论】:

  • 你能举个例子吗?
  • 我的答案实际上是数字 2 的示例。
  • @TolgayToklar 举例说明
【解决方案3】:

我解决了这个问题。

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);
}

现在我可以从片段中获取 edittext 值了。

【讨论】:

  • -1。根据onClick inside fragment called on Activity onClick 并不意味着以这种方式工作。这是不好的做法,因此不能解决您的问题。由于错误,我的代码实际上不起作用,这确保片段的 getFromUser 永远不会被调用。在我修复它之后使用我的代码将确保您的代码在未来仍然有效。
  • 但是它正在工作,你的意思是这个代码将来不会工作?
  • 不确定,但可能会发生。在任何情况下,您提供的代码都有效,但它不是干净的代码(请参阅this answer and its comments to How to handle button clicks using the xml onClick within Fragments)。这实际上似乎是一个相当微妙的话题。
  • 如果我使用上面给出的代码,您认为可能会发生什么危害?你让我怀疑
  • 最重要的是,您失去了片段可互换的优势(有关更多信息,请参阅developer.android.com/guide/components/fragments.html)。除此之外,Google 可能会决定修复此“错误”,并且 onClick 将链接到底层片段而不是其容器活动。在这种情况下,无论如何您都必须切换到我的解决方案而不进行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多