2014-01-15 100 views
0

我在練習使用Java/XML的Android編程。當我使用setText方法時,我的Android程序崩潰

至於以下代碼:我遇到麻煩的方法是OBClicked

OBClicked是我在ShareFragment中定義的接口(包含複選框和啓動TextFragment的按鈕)中的方法。

我這樣做是因爲根據我所瞭解的,在片段中定義接口並覆蓋宿主活動中的接口是一種很好的方法,可以將該信息傳輸到另一個片段。

在這種情況下,我重寫MainActivity中的OBClicked方法來告訴TextFragment(它只是一個TextView)是否檢查了ShareFragment中的CheckBox。根據是否選中,我嘗試告訴TextFragment使用setText顯示某些文本,但是這會使程序崩潰。這裏的代碼,任何幫助將不勝感激。 :

MainActivity:

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; 
    } 

} 

ShareFragment:

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; 
    } 

} 

TextFragment:

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; 
    } 
} 
+0

在堆棧跟蹤任何異常/錯誤? –

+1

請幫我看看LogCat –

+0

的內容,請問R.id.text_view屬於誰?對活動或片段? – Blackbelt

回答

0
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,你必須在片段的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; 
} 
+0

非常感謝,完美的作品:) –

相關問題