片段回调使用接口

时间:2016-02-08 09:04:37

标签: android android-fragments

我有Activity开始Fragmen t。在那个片段里面我有一个EditText。当我收到用户在那里输入的文字时,我希望在Activity的帮助下从interface获取该文字。我正在使用this guide

MainActivity我正在实施commentListener interfac e,我设法将结果放在 onCommentEntered 方法中。但是在 doneListener 上,当用户按下完成活动的按钮时触发,我将变为空。

显然onCommentEntered会在doneListener之后运行。

有关如何在doneListener上获得结果的任何建议?

class MainActivity implements fragment.commentListener{  

static String comment;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.addtransaction);
    done=(TextView)findViewById(R.id.done_button);
}

  // called when user presses a button and MainActivity finishes.

public void doneListener(View v){
    // Here i get NULL

    System.out.println(comment);
    finish();
}

 @Override
    public void onCommentEntered(String data) {
             comment=data;
             // Here i get what the user typed
             System.out.println(comment);
    }
}

我的片段

public class thefragment extends Fragment {

commentListener cListener;
static TextView note;
EditText comment;

public interface commentListener{
    void onCommentEntered(String data);
}

public static thefragment newInstance(){
    return new thefragment ();
}
public thefragment (){
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    cListener=(commentListener) context;
}

@Override
public void onDetach() {
    super.onDetach();
    cListener=null;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v;
    v=inflater.inflate(R.layout.fragment, container, false);

    comment=(EditText)v.findViewById(R.id.comment_picker);
    comment.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if (!hasFocus) {
                  cListener.onCommentEntered(comment.getText().toString());
            }
        }
    });
    return v;
}
}

2 个答案:

答案 0 :(得分:0)

创建一个新的接口,并在Fragment中实现它。在接口中创建一个方法并在Fragments中覆盖它。从Activity调用片段时,创建一个Interface类型片段并调用接口方法。

例如:

 public class thefragment extends Fragment implement fragmentNofyInterface {
   ...
   @Override
   protected void notify(String txt){
     mTvTxt.setText(txt);
   }
   .....
}

Interface Format

public interface fragmentNofyInterface {
     protected void notify(String txt);
}

活动格式

class MainActivity implements fragment.commentListener{  
       .....
       private fragmentNofyInterface mFragmentNotifier;

       .........

       thefragment  mFragment = new  thefragment();  
       mFragmentNotifier = (fragmentNofyInterface ) mFragment;
       FragmentTransaction transaction = mFragmentMngr.beginTransaction().
                            add(R.id.rl_fragment_navigation_container,
                                    mFragment);
       transaction .commit();

      ......

      //Notify the fragment when you required

      mFragmentNotifier.notify("hello world"); 


   }

答案 1 :(得分:0)

切换到addTextChangedListener的{​​{1}}和TextWatcher,例如this here, 似乎解决了我的问题。在EditText之前调用现在onCommentEntered方法,因此String doneListener获取在EditText中输入的任何内容。感谢所有人的帮助。