2013-04-17 46 views
1

我有一個片段中的列表視圖和另一個片段中的文本視圖。我必須在textview的listview中顯示數字的平方。然而,無論如何,即使點擊列表中的項目,文本也不會改變。將文本設置爲片段內的文本視圖

這裏是代碼...

MainActivity.Java

package com.example.fragmentdemo; 

public class MainActivity extends Activity implements Prime.onItemListSelectedListener{ 

    boolean mDualPane; 
    int n; 

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

     // Check that the activity is using the layout version with 
     // the fragment_container FrameLayout 
     if (findViewById(R.id.fragment_container) != null) { 

      // However, if we're being restored from a previous state, 
      // then we don't need to do anything and should return or else 
      // we could end up with overlapping fragments. 
      if (savedInstanceState != null) { 
       return; 
      } 

      Prime fragmentPrime = new Prime(); 
      fragmentPrime.setArguments(getIntent().getExtras()); 
      getFragmentManager().beginTransaction() 
      .add(R.id.fragment_container, fragmentPrime).commit(); 
     } 


     Square square = (Square) getFragmentManager().findFragmentById(R.id.fragment_content_2); 

     if(square != null) 
     { 
      // In Dual Pane Mode 

      square.setSquare(n); 
     } 

     else 
     { 
      Square newFragment = (Square) getFragmentManager().findFragmentById(R.id.fragment_content_2); 

      Bundle args = new Bundle(); 
      args.putInt("number", n); 
      newFragment.setArguments(args); 

      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

      // Replace whatever is in the fragment_container view with this fragment, 
      // and add the transaction to the back stack so the user can navigate back 
      transaction.replace(R.id.fragment_container, newFragment); 
      transaction.addToBackStack(null); 

      // Commit the transaction 
      transaction.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.activity_main, menu); 
     return true; 
    } 

    @Override 
    public void onItemSelected(int number) { 
     // TODO Auto-generated method stub 

     n = number; 
    } 

} 

Prime.Java - 第一塊碎片

package com.example.fragmentdemo; 

public class Prime extends Fragment{ 

    ArrayList<String> alPrime = new ArrayList<String>(); 
    ArrayAdapter<String> ad; 

    onItemListSelectedListener mCallback; 

    public interface onItemListSelectedListener{ 
     public void onItemSelected(int number); 
    } 


    @Override 
    public void onAttach(Activity activity) { 
     // TODO Auto-generated method stub 
     super.onAttach(activity); 


     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (onItemListSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement onItemListSelectedListener"); 
     } 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     View view = inflater.inflate(R.layout.fragment_prime_list, container, false); 

     setNumbers(); 

     final ListView lv = (ListView) view.findViewById(R.id.lvPrime); 
     ad = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, alPrime); 
     lv.setAdapter(ad); 

     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 

       mCallback.onItemSelected(Integer.parseInt(lv.getItemAtPosition(arg2).toString())); 
      } 
     }); 

     return view; 
    } 

    private void setNumbers() { 
     // TODO Auto-generated method stub 
     // Will replace this code with the logic of Prime Numbers later 
     for(int i = 2; i <= 10; i++) 
     { 
      alPrime.add(String.valueOf(i)); 
     } 
    } 

} 

Square.Java - 第二塊碎片

package com.example.fragmentdemo; 

public class Square extends Fragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     View view = inflater.inflate(R.layout.fragment_prime_list, container, false); 
     return view; 
    } 

    public void setSquare(int number) 
    { 
      // The toast displays zero 
     Toast.makeText(getActivity(), String.valueOf(number), Toast.LENGTH_LONG).show(); 
     TextView txtSquare = (TextView) getView().findViewById(R.id.txtViewSquare); 
     int square = number * number; 

    txtSquare.setText(String.valueOf(square));  
    } 

} 
+0

您需要發佈活動代碼爲好,因爲它似乎你通過他們的活動通信將這兩個片段。 – Egor

+0

他們的任何錯誤消息在你的logcat中? – Gunaseelan

+0

@Egor對不起。剛剛編輯 –

回答

2

當你活動收到在事件onItemSelected中,它不僅應該存儲數字,而且還應該在創建片段時將其傳遞給第二個片段,否則應該創建該片段並通過其參數bundle傳遞它的編號n。

@Override 
public void onItemSelected(int number) { 
    // TODO Auto-generated method stub 

    n = number; 

    //remove this code from onCreate and put it here 
    Square square = (Square) getFragmentManager().findFragmentById(R.id.fragment_content_2); 

    if(square != null) 
    { 
     // In Dual Pane Mode 
     square.setSquare(n); 
    } 
    else 
    { 
     Square newFragment = Square.newInstance(n); 

     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

     // Replace whatever is in the fragment_container view with this fragment, 
     // and add the transaction to the back stack so the user can navigate back 
     transaction.replace(R.id.fragment_container, newFragment); 
     transaction.addToBackStack(null); 

     // Commit the transaction 
     transaction.commit(); 
    } 
    } 

廣場片段:

public Square newInstance(int n) { 
     Square newFragment = new Square(); 
     Bundle args = new Bundle(); 
     //create a constant instead of the string 'number' 
     args.putInt("number", n); 
     newFragment.setArguments(args); 
     return newFragment; 
} 
+0

是的。我想我已經在MainActivity.java的onCreate()中做了這些。如果不是,你可以張貼我應該的地方。 –

+0

在單擊項目列表之前,onCreate將執行很多操作。 – Snicolas

+0

噢好吧..我會試一試並回復你。 –

相關問題