FindFragmentByTag返回null。

时间:2016-02-26 12:15:04

标签: java android android-fragments

我只是Android开发中的一个初学者,最近我在developer.android.com上启动了Android Tutorial。到目前为止,一切似乎都很好。我正在做这个课程http://developer.android.com/training/basics/fragments/communicating.html,我被困住了。我改变了一点,因为我想要更多的灵活性,所以我将片段添加到运行时。我花了一个小时寻找答案,但无法找到解决问题的方法。 :(

这是我的问题: 我想像在教程中那样与我的片段进行通信,但我使用findFragmentByTag而不是findFragmentById。我已经做了我能在互联网上找到的所有东西,但它说:

  

java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.filip.t1 / com.example.filip.t1.MainActivity}:java.lang.NullPointerException:尝试调用虚方法'void android.widget空对象引用上的.TextView.setText(java.lang.CharSequence)'

这是我的MainActivity:

public class MainActivity extends FragmentActivity
implements TextFragment.OnHeadlineSelectedListener{

EditText editText;
TextFragment fragment = new TextFragment();
Context context = this;
String fragment_tag = "FRAGMENTO";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, fragment, fragment_tag).commit();
    getSupportFragmentManager().executePendingTransactions();

    onArticleSelected(1);
}


@Override
public void onArticleSelected(int position) {

    TextFragment textFragment = (TextFragment) getSupportFragmentManager().findFragmentByTag(fragment_tag);

    if(textFragment != null){
        String strung = "It should be displayed, but it is not... :(";
        textFragment.updateText(strung);
    }else{
        Log.e("tag_prog","textFragment == null");
    }
}

碎片:

public class TextFragment extends Fragment {

TextView textView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_text, container, false);
    textView = (TextView)rootView.findViewById(R.id.textView);
    return rootView;
}

OnHeadlineSelectedListener mCallBack;

public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
}

@Override
public void onResume(){
    super.onResume();
}

public void onAttach(Activity activity){
    super.onAttach(activity);

    try{
        mCallBack = (OnHeadlineSelectedListener) activity;
    } catch(ClassCastException e) {
        throw new ClassCastException(activity.toString() + "must implement OHSL");
    }
}

public void funkcja(){

}

public void updateText(String s) {
    textView.setText(s);
}

感谢任何

2 个答案:

答案 0 :(得分:1)

问题是您在“活动”的onArticleSelected(1)中呼叫onCreate()。这在您的片段的onCreateView()被调用之前发生。因此,textView在此时仍为null。

尝试在您的Activity的onResume()中调用onArticleSelected(1)

查看您的活动和片段的生命周期here

答案 1 :(得分:0)

基本上,textview对象为null,这就是显示错误的原因。原因可能是您在片段已完成初始化之前调用updateText()方法。尝试在400ms过后调用该方法。

你可以这样做

    public void updateText(final String s) {
       if(textView!=null){
       textView.setText(s);
       }
else{
        new android.os.CountDownTimer(400, 400){

            @Override
            public void onFinish() {
                // TODO Auto-generated method stub
                updateText(s);
            }

            @Override
            public void onTick(long millisUntilFinished) {
                // TODO Auto-generated method stub

            }}.start();
}

    }