我正在使用片段,我在片段中有一个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值。我该怎么做?
答案 0 :(得分:4)
有两个approches
在您的片段中,您可以调用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();
}
}
创建界面。实施是在容器活动上。将其引用传递给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值。