Java 更好的按钮功能与碎片-Android

Java 更好的按钮功能与碎片-Android,java,android,android-fragments,Java,Android,Android Fragments,我对Android编程相当陌生,所以我需要一些帮助来解决以下问题。我需要知道,在处理片段时,是否有更好的方法添加按钮功能。我正在处理一个有三个活动的应用程序。然而,第二个活动(参见下面的代码)是最重要和最大的活动,在这里,应用程序的所有繁重工作都完成了。在这个(第二个)活动(“DmpAct.java”)中,我有一个片段容器(“R.id.dmpFragContainer”),其中多达15个不同的片段被切换出来并显示给用户——一次一个——这取决于用户想要做什么。因此,当“DmpAct.java”类启

我对Android编程相当陌生,所以我需要一些帮助来解决以下问题。我需要知道,在处理片段时,是否有更好的方法添加按钮功能。我正在处理一个有三个活动的应用程序。然而,第二个活动(参见下面的代码)是最重要和最大的活动,在这里,应用程序的所有繁重工作都完成了。在这个(第二个)活动(“DmpAct.java”)中,我有一个片段容器(“R.id.dmpFragContainer”),其中多达15个不同的片段被切换出来并显示给用户——一次一个——这取决于用户想要做什么。因此,当“DmpAct.java”类启动时,一个欢迎片段被加载到“dmpFragContainer”容器中,然后用户单击一个按钮转到下一个片段-该按钮将用被单击的按钮调用的片段替换欢迎片段

进退两难:目前“DmpAct.java”除了扩展布局(UI)并在单击按钮时成功地弹出各种片段之外,没有做什么。我在“DmpAct”活动的根上实现了一个OnClickListener,因为我在这个活动中使用了10个按钮。我还使用自定义片段动画(翻转动画)进行所有片段切换。我还需要标识当前加载的片段以及用户可见的片段(用于后续交互),因此我为每个片段提供了一个唯一的标记,这些片段将切换到FragmentManager。。。每次单击一个按钮,就会将下一个片段加载到“dmpFragContainer”中

。。。下面是第二个活动的代码-DmpAct.java

package com.wesoft.forgetfulme;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;

public class DmpAct extends Activity implements OnClickListener {

Fragment fragment;
Fragment newFragment;
String activeFrag;
FragmentManager FragMan;
FragmentTransaction TransAct;
Button birtListBtn, evenListBtn, appoListBtn, todoListBtn, specListBtn, dmpAddBtn, dmpExitBtn;


@SuppressLint({ "NewApi", "CommitTransaction" })
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    // Hide the Title Bar of the Application --> Must come before setting the Layout...
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // Hide the Status Bar of Android OS --> Can also be done later...
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


    // Now you can draw the second Layout --> DMP Screen of the Application...
    setContentView(R.layout.dmp_act);

    // Instantiate the FragmentManager and FragmentTranstion...
    FragmentManager FragMan = getFragmentManager();
    FragmentTransaction TransAct = FragMan.beginTransaction();


    // Define or set the initial/start fragment to be loaded when the view is rendered...
    DMPWelcFrag startFragment = new DMPWelcFrag();
    TransAct.add(R.id.dmpFragContainer, startFragment);
    TransAct.commit();


    // Instantiate (or get references to) all buttons laid out in this Activity and set the onClickListeners...
    Button birtListBtn = (Button) findViewById(R.id.dmp_bir_btn);
    birtListBtn.setOnClickListener(this);

    Button evenListBtn = (Button) findViewById(R.id.dmp_eve_btn);
    evenListBtn.setOnClickListener(this);

    Button appoListBtn = (Button) findViewById(R.id.dmp_app_btn);
    appoListBtn.setOnClickListener(this);

    Button todoListBtn = (Button) findViewById(R.id.dmp_tod_btn);
    todoListBtn.setOnClickListener(this);

    Button specListBtn = (Button) findViewById(R.id.dmp_spe_btn);
    specListBtn.setOnClickListener(this);

    Button dmpAddBtn = (Button) findViewById(R.id.dmp_add_btn);
    dmpAddBtn.setOnClickListener(this);

    Button dmpExitBtn = (Button) findViewById(R.id.dmp_exi_btn);
    dmpExitBtn.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();        

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.dmp, menu);
    return true;
}

@Override
@SuppressLint("NewApi")
public void onClick(View v) {

    // Set the DMP CATEGORY and ACTION Buttons Actions here ...
    if (v.getId() == R.id.dmp_bir_btn) {
        newFragment = new BirtListFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "BLF");
        TransAct.addToBackStack("BLF");
        TransAct.commit();
        // Toast.makeText(this, "This Fragment's tag is  ...  " + newFragment.getTag() , Toast.LENGTH_SHORT).show();
    }
    else if (v.getId() == R.id.dmp_eve_btn) {
        newFragment = new EvenListFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "ELF");
        TransAct.addToBackStack("ELF");
        TransAct.commit();
    }
    else if (v.getId() == R.id.dmp_app_btn) {
        newFragment = new AppoListFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "ALF");
        TransAct.addToBackStack("ALF");
        TransAct.commit();
    }
    else if (v.getId() == R.id.dmp_tod_btn) {
        newFragment = new TodoListFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "TLF");
        TransAct.addToBackStack("TLF");
        TransAct.commit();
    }
    else if (v.getId() == R.id.dmp_spe_btn) {
        newFragment = new SpecListFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "SLF");
        TransAct.addToBackStack("SLF");
        TransAct.commit();
    }
    else if (v.getId() == R.id.dmp_add_btn && newFragment.getTag() == "BLF") {
        newFragment = new BirtEditFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "BEF");
        TransAct.addToBackStack("BEF");
        TransAct.commit();
        // Toast.makeText(this, "This Fragment's tag is  ...  " + newFragment.getTag() , Toast.LENGTH_SHORT).show();
    }
    else if (v.getId() == R.id.dmp_add_btn && newFragment.getTag() == "ELF") {
        newFragment = new EvenEditFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "EEF");
        TransAct.addToBackStack("EEF");
        TransAct.commit();
        // Toast.makeText(this, "This Fragment's tag is  ...  " + newFragment.getTag() , Toast.LENGTH_SHORT).show();
    }
    else if (v.getId() == R.id.dmp_add_btn && newFragment.getTag() == "ALF") {
        newFragment = new AppoEditFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "AEF");
        TransAct.addToBackStack("AEF");
        TransAct.commit();
        // Toast.makeText(this, "This Fragment's tag is  ...  " + newFragment.getTag() , Toast.LENGTH_SHORT).show();
    }
    else if (v.getId() == R.id.dmp_add_btn && newFragment.getTag() == "TLF") {
        newFragment = new TodoEditFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "TEF");
        TransAct.addToBackStack("TEF");
        TransAct.commit();
        // Toast.makeText(this, "The tag of this fragment is  ...  " + newFragment.getTag() , Toast.LENGTH_SHORT).show();
    }
    else if (v.getId() == R.id.dmp_add_btn && newFragment.getTag() == "SLF") {
        newFragment = new SpecEditFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "SEF");
        TransAct.addToBackStack("SEF");
        TransAct.commit();
        // Toast.makeText(this, "The tag of this fragment is  ...  " + newFragment.getTag() , Toast.LENGTH_SHORT).show();
    }
    else {
        newFragment = new DMPWelcFrag();
    };


    // Set the DMP EXIT Button Action here ...
    if (v.getId() == R.id.dmp_exi_btn) {
        Intent go2Main = new Intent(DmpAct.this, MainAct.class);                  
        startActivity(go2Main);
    }
    else;
};

}
问题:问题是,目前的代码(如上所列),它甚至没有执行“DmpAct.java”活动应该完成的一半工作……看看代码已经有多么繁重和重复。每次单击按钮都需要进行文本和其他输入验证(此处代码列表中不明显-仍在等待中),然后需要将输入的值保存在捆绑包中(并保存到移动设备上的本地数据库文件中),然后再将输入的数据传递到下一个片段以显示给用户。现在,从这段代码中可以明显看出

else if (v.getId() == R.id.dmp_add_btn && newFragment.getTag() == "BLF") {
        newFragment = new BirtEditFrag();

        FragmentTransaction TransAct = getFragmentManager().beginTransaction();
        TransAct.setCustomAnimations(R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out);
        TransAct.replace(R.id.dmpFragContainer, newFragment, "BEF");
        TransAct.addToBackStack("BEF");
        TransAct.commit();  
。。。单击ADD按钮时,它会检查“dmpFragContainer”中当前加载的片段(使用上一个片段swop中提供的标记),并加载下一个正确的片段。现在,虽然这个过程很简单,但代码对我来说太庞大了,因为我正在为这个活动中使用的所有10个按钮执行完全相同的过程!所以我需要帮助。有没有更好的方法来实现相同的操作,而不必编写太多代码并重复相同的代码15次或更多次

伙计们,我知道当“DmpAct.java”类文件被扩展以添加更多功能时,这会给我带来性能问题。因此,任何建议和帮助都将不胜感激。提前谢谢

干杯,
SilSur.

我不知道这是否会导致性能问题,但我非常确定您可以稍微重新组织代码。开始使用
接口
,而不是使用if开关。因此,创建一个包含所有片段通用方法的接口,并将实现添加到片段类中。然后,您可以使用该接口调用希望显示的片段的方法。您还可以创建一个方法
fragmentType
,该方法将返回活动片段的类型。只需玩一下周围的接口。

感谢您的快速响应……嗯……但我必须先阅读这些“接口”和“碎片类型”的实现,然后才能确定它是否适合我对该应用程序的需求。我还在学习。。。不过还是要感谢AlecNash。对于接口:对于fragmentType,您将创建一个方法。谢谢,AlecNash。我终于明白了。谢谢你给我指引了正确的方向……:)