2

我在一个片段中有一个列表视图,在另一个片段中有一个文本视图。我必须在文本视图的列表视图中显示数字的平方。但是,无论如何我都会得到零,即使单击列表中的项目,文本也不会改变。

这是代码...

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

}
4

1 回答 1

3

当您的活动收到 onItemSelected 事件时,它不仅应该存储数字,而且如果片段已创建,还应该将其传递给第二个片段,否则,它应该创建片段并通过其参数包将数字 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;
}
于 2013-04-17T05:36:11.327 回答