Java 使用值从片段B返回片段A

Java 使用值从片段B返回片段A,java,android,android-fragments,Java,Android,Android Fragments,我知道有很多关于这方面的线索,但我似乎真的不明白如何去解决它。。我主要尝试的是在片段B中单击按钮之后,我想返回到片段A以及id值。。 因此,在我的后退中,你转到片段A,这将引导你到片段B,当按下一个按钮时,我想回到片段A,并显示一个值。这是片段B中的onClick侦听器: //Fragment B which i called from Fragment A addButton.setOnClickListener(new View.OnClickListener() { @O

我知道有很多关于这方面的线索,但我似乎真的不明白如何去解决它。。我主要尝试的是在片段B中单击按钮之后,我想返回到片段A以及id值。。
因此,在我的后退中,你转到片段A,这将引导你到片段B,当按下一个按钮时,我想回到片段A,并显示一个值。这是片段B中的onClick侦听器:

//Fragment B which i called from Fragment A
addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(value.getText().toString().trim().length() != 0) {
                 String order = value.getText().toString(); //The value i want in Fragment B
                 //return to Fragment A
            }
}
在我的主要活动中,我像这样踩着我的碎片:

//fragmentManager is initialized in onCreate()
...
private void selectItem(int position) {

    Fragment fragment = null;
    String fTag = null;

    switch (position) {
        case 0:
            fragment = new FragmentA();
            fTag = "fragmentA";
            break;
        case 1:
            fragment = new FragmentC();
            fTag = "fragmentC";
            break;
        case 2:
            fragment = new FragmentD();
            fTag = "fragmentD";
            break;

        default:
            break;
    }

    if (fragment != null) {
        if(replaceFragments(fragment, fTag)) {
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(mNavigationDrawerItemTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        }
    } else {
        Log.e(LOGTAG, "Error in creating fragment");
    }
}

public boolean replaceFragments(Fragment fragment, String fTag) {
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, fTag).addToBackStack(fTag).commit();
    return true;
}

@Override
public void onBackPressed() {
    int count = fragmentManager.getBackStackEntryCount();
    if (count == 0) {
        super.onBackPressed();
    } else {
        getSupportFragmentManager().popBackStack();
        //TODO: add app title on count == 1
    }
}
 @Override 
    public void onClick(View view) {
        if(value.getText().toString().trim().length() != 0) { 
             String order = value.getText().toString(); //The value i want in Fragment B
             //return to Fragment A 

            FragmentA fragment = new FragmentA();
            Bundle args=new Bundle();
            args.putString(order);
           fragment.setArguments(args);
           getFragmentManager().beginTransaction().replace((R.id.content_frame,fragment).commit();


        } 

创建接口ValueChangeListener.java

public interface ValueChangeListener {

    public void onValueChanged(String value);
}
通过接口传递值:

public class FragmentB extends Fragment {

    private ValueChangeListener valueChangeListener;

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

    //your code
    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(value.getText().toString().trim().length() != 0) {
                 String order = value.getText().toString();
                 //now the value is in the Activity and you can pass it anywhere you want from there
                 valueChangeListener.onValueChanged(order);
            }
    }

}
实现活动的接口:

public class YourActivity extends FragmentActivity implements ValueChangeListener{

    @Override
    public void onValueChanged(String value) {
    //your value is here
    }
}

您的onclick方法应该如下所示:

//fragmentManager is initialized in onCreate()
...
private void selectItem(int position) {

    Fragment fragment = null;
    String fTag = null;

    switch (position) {
        case 0:
            fragment = new FragmentA();
            fTag = "fragmentA";
            break;
        case 1:
            fragment = new FragmentC();
            fTag = "fragmentC";
            break;
        case 2:
            fragment = new FragmentD();
            fTag = "fragmentD";
            break;

        default:
            break;
    }

    if (fragment != null) {
        if(replaceFragments(fragment, fTag)) {
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(mNavigationDrawerItemTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        }
    } else {
        Log.e(LOGTAG, "Error in creating fragment");
    }
}

public boolean replaceFragments(Fragment fragment, String fTag) {
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, fTag).addToBackStack(fTag).commit();
    return true;
}

@Override
public void onBackPressed() {
    int count = fragmentManager.getBackStackEntryCount();
    if (count == 0) {
        super.onBackPressed();
    } else {
        getSupportFragmentManager().popBackStack();
        //TODO: add app title on count == 1
    }
}
 @Override 
    public void onClick(View view) {
        if(value.getText().toString().trim().length() != 0) { 
             String order = value.getText().toString(); //The value i want in Fragment B
             //return to Fragment A 

            FragmentA fragment = new FragmentA();
            Bundle args=new Bundle();
            args.putString(order);
           fragment.setArguments(args);
           getFragmentManager().beginTransaction().replace((R.id.content_frame,fragment).commit();


        } 
然后从碎片A中,您可以通过以下方式恢复价值:

getArguments();

谢谢。这是有道理的。你能告诉我,当我在活动中收到值时,如何正确地调用片段A吗?我的意思是,最好从backbackback调用它/从tag获取它?啊哈,当然!我不知道为什么我没有想到那件事。。当您可以这样设置参数时,为什么接口方法如此常见?使用接口,您可以将值发送到活动。如果这不是你想要的,那么你可以使用上面的方法将你的值直接发送到另一个片段。既然fragmentManager生活在活动中,我想我还是走那条路吧?但实际上我在某个地方看到,不建议在片段之间直接发送?快速阅读,你可能会发现一些东西:尽管它从未说明原因……也许其他人可以对此有所了解。