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

我正在练习使用Java/XML 的Android 编程。

至于下面的代码:我遇到问题的方法是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 属于谁?到活动还是到片段?

标签: java android eclipse view android-fragments


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多