当我使用 setText 方法时,我的 Android 程序崩溃了

Posted

技术标签:

【中文标题】当我使用 setText 方法时,我的 Android 程序崩溃了【英文标题】:My Android program crashes when I use the setText method 【发布时间】:2014-01-15 07:55:11 【问题描述】:

我正在练习使用Java/XMLandroid 编程。

至于下面的代码:我遇到问题的方法是OBClicked

OBClicked 是我在 ShareFragment 中定义的接口中的一个方法(其中包含一个复选框和一个启动 TextFragment 的按钮)。

我这样做是因为据我所知,在片段中定义一个接口并在托管活动中覆盖该接口是一种可以将该信息传输到另一个片段的好方法。

在这种情况下,我重写了 MainActivity 中的 OBClicked 方法来告诉 TextFragment(它只是一个 TextView)是否检查了 ShareFragment 中的 CheckBox。根据是否检查,我尝试告诉 TextFragment 使用 setText 显示某些文本,但这会使程序崩溃。这是代码,任何帮助将不胜感激。 :

主活动:

public class MainActivity extends FragmentActivity implements ShareFragment.ClickListener

    @Override
    public void oBClicked(boolean x)
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        TextView t = (TextView)findViewById(R.id.text_view);
        if(x == true)
            t.setText("The box is checked");
        else
            t.setText("The box isn't checked");
        
        Fragment fragment = new TextFragment();
        ft.replace(R.id.fragmentContainer, fragment);
        ft.addToBackStack(null);
        ft.commit();


    

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

        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
        if(fragment == null)
            fragment = new ShareFragment();
        
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.fragmentContainer, fragment);
        ft.commit();
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    


共享片段:

    public class ShareFragment extends Fragment 
        Button mButton; 
    String mText;
    Boolean mTruthValue;
    CheckBox mCheckBox;
    private int mCounter;
    //CROSS FRAGMENT COMMUNICATION START
    ClickListener mListener;
    public interface ClickListener
        public void oBClicked(boolean x);
    

    public void oBClicked(boolean x)
        mListener.oBClicked(x);
    
    //CROSS FRAGMENT COMMUNICATION FIN

    @Override
    public void onAttach(Activity activity)
        super.onAttach(activity);
        try
            mListener = (ClickListener) activity;
        
        catch(Exception e)
            //
        

    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle save)
        View v = inflater.inflate(R.layout.fragment_share, container, false);
        mButton = (Button)v.findViewById(R.id.button1);
        mCheckBox = (CheckBox)v.findViewById(R.id.check_box);
        mCounter = 1;
        mCheckBox.setOnClickListener(new OnClickListener()
            @Override
            public void onClick(View v)
                mCounter++;
            
        );
        mButton.setOnClickListener(new OnClickListener()
            @Override
            public void onClick(View v)
                //mCheckBox = (CheckBox)v.findViewById(R.id.check_box);
                if(mCounter%2 == 0)
                    mTruthValue = true;
                else
                    mTruthValue = false;
                
                oBClicked(mTruthValue);
            
        );
        return v;
    


文本片段:

   public class TextFragment extends Fragment
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle save)
        View v = inflater.inflate(R.layout.fragment_text, container, false);
        return v;
    

【问题讨论】:

堆栈跟踪中是否有异常/错误? 请显示您的 LogCat 的内容 请帮我理解一下,R.id.text_view 属于谁?到活动还是到片段? 【参考方案1】:
   TextView t = (TextView)findViewById(R.id.text_view);
    if(x == true)
        t.setText("The box is checked");
    else
        t.setText("The box isn't checked");
    

这会在您的活动中查找 TextView。如果要在 TextFragment 中获取 TextView,则必须在 Fragment 的 onCreateView 或 onViewCreated 中找到它。要在创建时将数据传递给片段,请使用 setArguments 和 getArguments。

@Override
public void oBClicked(boolean x)
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    Fragment fragment = new TextFragment();

    Bundle arguments = new Bundle();
    arguments.putBoolean("data",x);
    fragment.setArguments(arguments);

    ft.replace(R.id.fragmentContainer, fragment);
    ft.addToBackStack(null);
    ft.commit();

在TextFragment的onCreateView中...

public class TextFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle save)
    View v = inflater.inflate(R.layout.fragment_text, container, false);
    TextView t = (TextView)v.findViewById(R.id.text_view);

     Bundle arguments = getArguments();
     boolean x = arguments.getBoolean("data");

     if(x == true)
       t.setText("The box is checked");
     else
       t.setText("The box isn't checked");
        
     return v;

【讨论】:

以上是关于当我使用 setText 方法时,我的 Android 程序崩溃了的主要内容,如果未能解决你的问题,请参考以下文章

QLineEdit 不使用 setText 更新

如何修复翻译无法使用TextView.setText()?

我可以在使用自定义键盘时访问 EditText setText 方法吗?

UiAutomator Android - setText 方法不起作用!

Android:使用 Textview.SetText(characterSequence) 获取 [OBJ]

setText 没有将文本设置为 EditText