Java Android Studio:使用另一个活动中的数据更新片段列表
我正在制作一个捐赠应用程序。有一个金额选择器,用户可以在其中选择捐赠金额。 还有一个文本视图,如果用户多次捐款,可以查看捐款总额 我正在尝试实现一个捐赠历史记录,其中列表中的每个项目都是$X。我在同一屏幕上使用了一个使用片段的列表,使用预定义的字符串数组效果非常好 每次用户单击“捐赠”按钮时,我试图将捐赠的金额传递给碎片时,我的应用程序崩溃 我想不出是什么问题。我猜可能片段需要用新数据刷新,或者我传递数据的方式不对。我完全被卡住了,不知道如何解决这个问题。非常感谢您的帮助,谢谢 MainActivity.javaJava Android Studio:使用另一个活动中的数据更新片段列表,java,android,android-studio,android-fragments,Java,Android,Android Studio,Android Fragments,我正在制作一个捐赠应用程序。有一个金额选择器,用户可以在其中选择捐赠金额。 还有一个文本视图,如果用户多次捐款,可以查看捐款总额 我正在尝试实现一个捐赠历史记录,其中列表中的每个项目都是$X。我在同一屏幕上使用了一个使用片段的列表,使用预定义的字符串数组效果非常好 每次用户单击“捐赠”按钮时,我试图将捐赠的金额传递给碎片时,我的应用程序崩溃 我想不出是什么问题。我猜可能片段需要用新数据刷新,或者我传递数据的方式不对。我完全被卡住了,不知道如何解决这个问题。非常感谢您的帮助,谢谢 MainAct
public class MainActivity extends AppCompatActivity {
private Button donateButton;
private RadioGroup paymentMethod;
private ProgressBar progressBar;
private NumberPicker amountPicker;
private TextView totalTextView;
private int totalDonated = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
donateButton = (Button) findViewById(R.id.donateButton);
if (donateButton != null)
{
Log.v("Donate", "Really got the donate button");
}
paymentMethod = (RadioGroup) findViewById(R.id.paymentMethod);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
amountPicker = (NumberPicker) findViewById(R.id.amountPicker);
totalTextView = (TextView) findViewById(R.id.totalTextView);
// set the min and max values for the amount picker
amountPicker.setMinValue(0);
amountPicker.setMaxValue(1000);
progressBar.setMax(10000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void donateButtonPressed (View view)
{
int amount = amountPicker.getValue();
int radioId = paymentMethod.getCheckedRadioButtonId();
String method = "";
if (radioId == R.id.PayPal){
method = "PayPal";
} else {
method = "Direct";
}
TITLES[0] = "Donated " + totalDonated;
totalDonated = totalDonated + amount;
progressBar.setProgress(totalDonated);
String msg = "Total so far $"+totalDonated;
totalTextView.setText(msg);
Log.v("Donate", "Donate Pressed! with amount " + amount + ", method: " + method);
Log.v("Donate", "Current total " + totalDonated);
}
String[] TITLES = new String[3];
public String[] getDonationsArray() {
return TITLES.clone();
}
}
DonationHistory.java
public class DonationHistory extends ListFragment {
ListView listview;
View view;
MainActivity newDonationData = new MainActivity();
String[] Array = newDonationData.getDonationsArray();
public View onCreateView(LayoutInflater i,ViewGroup container,Bundle savedInstanceState)
{
ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(), R.layout.simple_list_item_1,R.id.text1,Array);
setListAdapter(adapter);
return super.onCreateView(i,container,savedInstanceState);
}
}
公共类捐赠历史扩展ListFragment{
列表视图列表视图;
视图;
MainActivity newDonationData=新的MainActivity();
String[]数组=newDonationData.getDonationsArray();
创建视图上的公共视图(LayoutFlater i、ViewGroup容器、Bundle savedInstanceState)
{
ArrayAdapter=新的ArrayAdapter(getActivity(),R.layout.simple_list_item_1,R.id.text1,数组);
setListAdapter(适配器);
返回super.onCreateView(i、容器、savedInstanceState);
}
}
你的片段
有一些大缺陷
MainActivity newDonationData = new MainActivity();
你不能以这种方式创建Acivity
,永远不要这样做!即使可以-这是新对象,其String[]TITLES
始终为空(新创建的)
在Fragment
内部,您可以使用getActivity()
方法获取Activity
所附加的Fragment
((MainActivity) getActivity()).getDonationsArray();
只有在创建了活动后才能使用getActivity()
,请在中签出Fragment
生命周期
另外,在super.onCreateView之前,您正在使用setListAdapter
(
call-这可能会导致NPE,因为ListView
没有膨胀/设置,适配器也没有视图
可附加到。在super
调用之后,将setListAdapter
移动到onViewCreated
方法。但您需要直接从活动
获取数据,因此在您的情况下,更好的方法是附加在创建的活动上调整(也在超级调用之后)
以上都是猜测,因为您没有提供任何带有错误的logcat,我甚至不知道如何开始您的捐赠历史
片段
(用XML修复?显示logcat和错误行。。