如何获取片段标签或ID?

时间:2015-12-24 04:39:48

标签: android android-fragments

我有2个片段,这些片段是从同一个类中实例化的,因为布局是相同的,如下所示:

<?php
define ("DB_HOST", "localhost"); // set database host
define ("DB_USER", "root"); // set database user
define ("DB_PASS",""); // set database password
define ("DB_NAME","users"); // set database name

$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS) or die("Couldn't make connection.");
$db = mysqli_select_db()($link, "users") or die("Couldn't select database: " . mysqli_connect_error());
?>

在LeftFragmentClass中,有一个回调方法,当按下片段中的按钮时会调用该方法。在此之后,完成一些处理并显示数据,但是,现在回调无法区分按下了哪个按钮。是否有一个函数可以返回按下哪个片段按钮?

6 个答案:

答案 0 :(得分:1)

Fragment fragment = getFragmentManager().findFragmentByTag("Tag")

答案 1 :(得分:1)

对于这种类型的条件,我在片段内部创建一个函数,它将返回片段的实例,并使片段构造函数变为私有,如: -

public class LeftFragmentClass extends Fragment{
   private String fragmentTag = null;

   public LeftFragmentClass(){}

   public static LeftFragmentClass newInstance(String tag){
       LeftFragmentClass mLeftFragmentClass = new LeftFragmentClass();
       Bundle bundle = new Bundle();
       bundle.putString ("tag",tag);
       mLeftFragmentClass.setArgument(bundle);

       return mLeftFragmentClass;
   }

   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
        tag = getArguments().getString("tag")
   }

}

所以我使用newInstance函数来创建LeftFragmentClass的实例并将标记传递给它,我使用bundle设置为Fragment参数,使用getArguments在onCreate get bundle中设置标签值。将此标记值作为参数之一传递给回调方法,以识别单击了哪个按钮。

因此,从获取LeftFragmentClass实例的活动中,您可以写为

LeftFragmentClass mLeftFragmentClassLeft = LeftFragmentClass.newInstance("left")

LeftFragmentClass mLeftFragmentClassRight = LeftFragmentClass.newInstance("Right")

====编辑====

保持片段类构造函数始终公开不要像我在上面的示例代码中建议的那样将其设为私有。将其设为私有将导致应用程序崩溃,但异常

  

java.lang.RuntimeException:无法启动活动   ComponentInfo {} MainActivity:   android.support.v4.app.Fragment $ InstantiationException:无法执行   实例化片段com.thatswhy.AppAlertDialog:确保类名   exists,是public,并且有一个空的构造函数是公共的

答案 2 :(得分:0)

根据您提供的信息,您可以在callback method传递button对象并执行相应检查,

一些代码片段解释相同:

假设您的回调方法为onButtonClick(),那么您可以传递button对象,如:

public void onButtonClick(Button button){
      // check here with button id
      if(button.getId() == R.id.button1) {

      } else if(button.getId() == R.id.button1) {

      }
}

希望这能让事情变得清晰。

答案 3 :(得分:0)

我见过最干净的方法是在Activity中创建两个不同的View.OnClickListener。

每个人都有一个getter()。 public View.OnClickListener getLeftButtonPressed()public View.OnClickListener getRightButtonPressed()

然后,当您实例化片段的左右实例时,只需传入适当的&#39; View.OnClickListener&#39;到Fragment的构造函数。这不仅减少了片段中的代码,还集中了“逻辑”。按下按钮时该怎么做

public class MyActivity extends Activity {

    // create the two listeners
    View.OnClickListener leftButtonListener = new View.OnClickListener() {
         public void onClick(View v) {
             leftButtonClicked(v);
         }
     });
     View.OnClickListener rightButtonListener = new View.OnClickListener() {
         public void onClick(View v) {
             rightButtonClicked(v);
         }
     });

     // 2 getters
     public View.OnClickListener getLeftListener() { return this.leftButtonListener; }
     public View.OnClickListener getRightListener() { return this.rightButtonListener; }

 protected void onCreate(Bundle icicle) {
     super.onCreate(icicle);

     setContentView(R.layout.content_layout_id);

 }

 // actual logic of what to do when each button is pressed.
 private void leftButtonClicked(View v){
       // some logic here
 }
 private void rightButtonClicked(View v){
       // some logic here
 }

}

这样你以后就可以通过使用字符串和if / then / else块等跟踪按下哪个按钮了。

答案 4 :(得分:0)

在片段中为接口回调函数添加参数;

interface Interfacecallback{
public void callbackfunction(int fragid);
}

Interfacecallback interfacecallback;


//in your button click

//pass 1 for fragment right
//pass 2 for fragment left
interfacecallback.callbackfunction(1);

答案 5 :(得分:0)

您可以使用以下代码行检查片段标记: -

Fragment mapFragment = getFragmentManager().findFragmentByTag("MapRestaurantFragment");