我在一个片段中有一个listview,在另一个片段中有一个textview。我必须在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 - First Fragment
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 - Second Fragment
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 :(得分:2)
当你的活动接收到事件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;
}