2013-04-17 117 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

噢好吧..我会试一试并回复你。 –

相关问题