Java 最后一个变量在OnClickListener[Android]中改变自身

Java 最后一个变量在OnClickListener[Android]中改变自身,java,android,listener,onclicklistener,final,Java,Android,Listener,Onclicklistener,Final,我不是安卓编程的专家,但这一次真是让我受不了。我只是想把一个结构“挑战”从一个片段传递到一个活动,没什么特别的。然后我创建我的结构的最终版本,这很好。但是当我进入OnClickListener时,它就不再是原来的样子了,因为它缺少ArrayList[Score](“Score”是另一种结构)。举例来说,我有一个打印结构的函数,我可以清楚地看到onCreate()中没有问题,下面的两行不再匹配。我挠头已经有一段时间了,但我现在得请求你的帮助,否则我的键盘会飞起来的 详细信息片段: public c

我不是安卓编程的专家,但这一次真是让我受不了。我只是想把一个结构“挑战”从一个片段传递到一个活动,没什么特别的。然后我创建我的结构的最终版本,这很好。但是当我进入OnClickListener时,它就不再是原来的样子了,因为它缺少ArrayList[Score](“Score”是另一种结构)。举例来说,我有一个打印结构的函数,我可以清楚地看到onCreate()中没有问题,下面的两行不再匹配。我挠头已经有一段时间了,但我现在得请求你的帮助,否则我的键盘会飞起来的

详细信息片段:

public class DetailsFragment extends Fragment {

    public DetailsFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_details, container, false);

        // Get challenge details
        Bundle b = getArguments();
        Challenge challenge = (Challenge) b.getSerializable("challenge");
        Log.v("APP", "DetailsFragment : " + challenge.printToFile());

        // Buttons
        final Challenge finalC = challenge;
        Log.v("APP", finalC.printToFile());
        ((Button) rootView.findViewById(R.id.btn_Go)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.v("APP", finalC.printToFile());
                Intent intent = new Intent(getActivity(), ChallengeActivity.class);
                intent.putExtra("challenge", finalC);
                startActivity(intent);
            }
        });
        ((Button) rootView.findViewById(R.id.btn_Cancel)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().finish();
            }
        });

        // Set up layout
        if (challenge != null) {

            // Details
            ((TextView) rootView.findViewById(R.id.label_challengeName)).setText(challenge.name);
            ((TextView) rootView.findViewById(R.id.label_Distance2)).setText(String.valueOf(challenge.distance) + " m");
            ((TextView) rootView.findViewById(R.id.label_Lap2)).setText(String.valueOf(challenge.lap) + " m");
            ((TextView) rootView.findViewById(R.id.label_Objective2)).setText(challenge.printObjective());

            // Averages
            double avg = (challenge.distance * 1.0 / challenge.objective) * 3.6;
            ((TextView) rootView.findViewById(R.id.label_AvgSpeed2)).setText(String.format("%.2f", avg) + " km/h");
            int avg_sec = (int) (challenge.lap / (challenge.distance * 1.0 / challenge.objective));
            int sec = avg_sec % 60;
            int min = (avg_sec - sec) / 60;
            String obj = "";
            if (min > 0)
                obj += String.valueOf(min) + "'";
            obj += String.format("%02d", sec) + "\"";
            ((TextView) rootView.findViewById(R.id.label_AvgTime2)).setText(obj);

        }

        return rootView;

    }

}
和日志:

01-09 12:16:26.569 23926-23926/domk.mychallenge V/APP: DetailsFragment : Course Police:2400/400:720:10-12-2016/104,127,135,130,125,138:14-12-2016/122,128,128,132,130,108:24-12-2016/126,130,133,134,130,125
01-09 12:16:26.571 23926-23926/domk.mychallenge V/APP: Course Police:2400/400:720:10-12-2016/104,127,135,130,125,138:14-12-2016/122,128,128,132,130,108:24-12-2016/126,130,133,134,130,125
01-09 12:16:36.528 23926-23926/domk.mychallenge V/APP: Course Police:2400/400:720
结构从MainActivity中的文件加载,然后传递给DetailsActivity:

public class DetailsActivity extends AppCompatActivity {

    Challenge challenge;
    TabLayout tabLayout = null;
    ViewPager viewPager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        if (tabLayout != null) {
            tabLayout.addTab(tabLayout.newTab().setText("Details"));
            tabLayout.addTab(tabLayout.newTab().setText("Scores"));
            tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        } else {
            Toast.makeText(getApplication().getBaseContext(), "Internal error", Toast.LENGTH_LONG).show();
            finish();
        }

        Bundle b = getIntent().getExtras();
        challenge = (Challenge) b.getSerializable("challenge");

        viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount(), challenge));
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    }

}
PagerAdapter如下所示:

public class PagerAdapter extends FragmentStatePagerAdapter {

    int mNumOfTabs;
    Challenge challenge;

    public PagerAdapter(FragmentManager fm, int NumOfTabs, Challenge challenge) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
        this.challenge  = challenge;
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        Bundle bundle = new Bundle();
        bundle.putSerializable("challenge", challenge);

        switch (position) {

            case 0:
                DetailsFragment tab1 = new DetailsFragment();
                tab1.setArguments(bundle);
                return tab1;

            case 1:
                ScoresFragment tab2 = new ScoresFragment();
                tab2.setArguments(bundle);
                return tab2;

            default:
                return null;

        }
    }

}
结构
得分

public class Score implements Serializable {

    Date date;
    ArrayList<Integer> laps;

    public Score() {

        Calendar c = Calendar.getInstance();
        date = c.getTime();
        laps = new ArrayList<Integer>();

    }

    public Score(Date d, ArrayList<Integer> l) {

        date = d;
        laps = l;

    }

    public void newLap(int score) { laps.add(score); }

    public String printLaps() {

        String s = "";
        for (int i = 0; i < laps.size(); i++) {
            s += "Lap " + String.valueOf(i + 1) + " : " + String.valueOf(laps.get(i)) + "s";
            if (i != (laps.size() - 1))
                s += "\n";
        }

        return s;

    }

    public String printToFile() {

        String s = ":" + new SimpleDateFormat("dd-MM-yyyy").format(date) + "/";
        for (int i = 0; i < laps.size(); i++) {
            s += String.valueOf(laps.get(i));
            if (i < (laps.size() - 1))
                s += ",";
        }

        return s;
    }

    public int getTime() {

        int sum = 0;
        for (int i = 0; i < laps.size(); i++)
            sum += laps.get(i);
        return sum;

    }

}
public class Challenge implements Serializable {

    String           name;
    int              distance;
    int              lap;
    int              objective;
    ArrayList<Score> scores;

    public Challenge(String n, int d, int l, int o) {
        name      = n;
        distance  = d;
        lap       = l;
        objective = o;
        scores    = new ArrayList<Score>();
    }

    public String printToFile() {
        String s = name + ":" + Integer.valueOf(distance) + "/" + Integer.valueOf(lap) + ":" + Integer.valueOf(objective);
        for (int i = 0; i < scores.size(); i++)
            s += scores.get(i).printToFile();
        return s + "\n";
    }

    public String printObjective() {

        // Default format : XX'XX"
        if (format.length() < 2)
            format = "'\"";

        String time = "";

        int sec = objective % 60;
        int min = (objective - sec) / 60;

        if (min > 0)
            time +=  String.valueOf(min) + format.charAt(0);
        time += String.format("%02d", sec) + format.charAt(1);

        return time;

    }

    public void newScore(Score s) { scores.add(s); }


    public ArrayList<Integer> getTimes() {

        ArrayList<Integer> t = new ArrayList<Integer>();

        for (int i = 0; i < scores.size(); i++)
            t.add(scores.get(i).getTime());

        return t;

    }

}
我基本上无法理解最后一个变量在第二个和第三个日志之间是如何变化的。我甚至不知道在网上找什么,因为这看起来很愚蠢


如果这是某种形式的重复,我很抱歉,希望我的英语至少可以理解…

Java Final关键字:

java中的最后一个关键字用于限制用户。java决赛 关键字可以在许多上下文中使用

最后一个关键字可以与 变量,最后一个没有值的变量称为空白 最终变量或未初始化的最终变量。它可以初始化 仅在构造函数中。空白最终变量也可以是静态变量。 它将仅在静态块中初始化。我们会 详细了解这些。让我们首先学习期末考试的基础知识 关键词

您可以查看类似于
Static
variable的内容,以便在尝试获取变量时保持变量不变


final
简单地停止重新分配变量,即一旦分配了变量,就不能写入
finalC=任何内容。但您(或引用同一对象的任何其他人)仍然可以更改其字段或调用更改其字段的方法:

final List<String> finalList = new ArrayList<>(Array.asList("hello"));
System.out.println(finalList);  // Prints [hello]
finalList.clear();
System.out.println(finalList);  // Prints []

它是否以某种方式回答了作者的问题?据我所知,作者问如何保持变量的值不变。当您想要引用一个常量值,而不是硬编码它时,Static关键字使用了很多。因此,我假设,如果您将变量初始化为静态变量,当您尝试获取它时,它将保留该值。不,他是在问为什么变量在
onClickListener
中发生了更改。我没有看到
质询
代码,因此,尽管引用保持不变,但内容没有改变。查看上面的列表示例。显示
DetailsFragment
的完整代码。您可以在其他地方修改变量。这是完整的代码,不包括一些不相关的setText()…同样,
Challenge
代码丢失了…如果您坚持,但您在那里不会发现太多有趣的内容,实际上,它们是简单的结构。如果您想获得帮助,必须显示
详细信息片段的完整代码。编辑了我指定数据流的帖子,但我仍然不理解任何活动何时收到不完整的结构。
final List<String> finalList = new ArrayList<>(Array.asList("hello"));
final List<String> copyOfFinalList = new ArrayList<>(finalList);

System.out.println(finalList);        // Prints [hello]
System.out.println(copyOfFinalList);  // Prints [hello]

finalList.clear();

System.out.println(finalList);        // Prints []
System.out.println(copyOfFinalList);  // Prints [hello]