2014-09-03 51 views
2

我是Android和Java的初學者,我剛剛看到一些在java中使用getter和setter方法的視頻,當我在同一個類中使用getter和setter方法時,該方法運行良好。但是,當我使用setter方法從主類設置圖像的位置,並嘗試從我的片段類使用getter方法檢索它返回0.有一個類似的問題在stackoverflow中問我不明白。請幫我..我 主類:Getter從其他類調用時返回0

public class Login_Register extends Activity implements OnClickListener { 
     Login login = new Login(); 
     Register register = new Register(); 
    ImageButton LoginB; 
     ImageButton RegisterB; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 

      setContentView(R.layout.login_register); 
      FragmentManager fmanager = getFragmentManager(); 
      LoginB = (ImageButton) findViewById(R.id.login_button); 
      RegisterB = (ImageButton) findViewById(R.id.Reg_button); 
      LoginB.setOnClickListener(this); 
      RegisterB.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 

      Positions pos = new Positions(); 
      pos.setLIpos(LoginB.getY()); 
      pos.setRIpos(RegisterB.getY()); 

      FragmentTransaction transaction = fmanager.beginTransaction(); 
        switch (v.getId()) { 

      case R.id.login_button: 

       transaction.add(R.id.Parent, login, "Loginf"); 
      transaction.addToBackStack("Login"); 

       break; 
      case R.id.Reg_button: 
        transaction.add(R.id.Parent, register, "registerf"); 
       transaction.addToBackStack("registerf"); 

       break; 
      default: 
       break; 
      } 
      transaction.commit(); 

      // TODO Auto-generated method stub 

     } 


    } 

我的片段類:

public class Login extends Fragment implements OnGlobalLayoutListener { 
    EditText UN, Pass; 
    View loginimage, loginusing, loginlayout; 

    // Login_Register Lg=new Login_Register(); 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View login = inflater.inflate(R.layout.login, container, false); 
     // TODO Auto-generated method stub 
     UN = (EditText) login.findViewById(R.id.UsernameL); 
     Pass = (EditText) login.findViewById(R.id.PassswordL); 
     loginimage = login.findViewById(R.id.LoginImage); 

     loginusing = login.findViewById(R.id.loginusing); 
     loginlayout = login.findViewById(R.id.LoginLayout); 
     loginimage.getViewTreeObserver().addOnGlobalLayoutListener(this); 
     UN.getBackground().setAlpha(50); 
     Pass.getBackground().setAlpha(50); 
     Positions poss=new Positions(); 
     float f=poss.getLIpos(); 
     ObjectAnimator.ofFloat(loginusing, View.ALPHA, 0,1).setDuration(1000).start(); 

     return login; 
    } 
} 

類具有setter和getter方法:

public class Positions { 
    private float LIpos=0; 
    private float RIpos=0; 

    public Positions() { 
     // TODO Auto-generated constructor stub 
    } 
    public float getLIpos() { 
     Log.i("allalalla", ""+LIpos); 
     return LIpos; 
    } 
    public void setLIpos(float lIpos) { 
     LIpos = lIpos; 
    } 
    public float getRIpos() { 
     return RIpos; 
    } 
    public void setRIpos(float rIpos) { 
     RIpos = rIpos; 
    } 
} 

回答

1

讓你實例化浮動之前,您類。這就產生了用浮漂默認類如果你想保存這個類的不同實例之間浮動然後進行彩車靜態初始化爲0

Positions poss=new Positions(); 
float f=poss.getLIpos(); 

private static float LIpos; 
private static float RIpos; 

另外,您可以保存對保存浮動並將其片段傳遞給它的實例的引用,或者您的片段可以直接從您的活動中獲取該實例:

public Position pos; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    @Override 
    public void onClick(View v) { 
     pos = new Positions(); 
     ... 
} 

然後在你的片段獲取位置元素,並得到彩車:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    ... 
    float LIpos = ((Login_Register)getActivity()).pos.getLIpos(); 
    ... 
} 
+0

太簡單了......感謝您的幫助....... – Harsha 2014-09-03 08:03:16

+0

從長遠看,建議人們使用靜態變量可能沒有幫助。 Java是一種面向對象的語言,靜態語言在語言上是一種非OO語言。避免它們是可能的。 – 2014-09-03 08:05:25

+0

@StephenC用2個更合適的解決方案更新了我的答案,顯示了其中一個解決方案的示例。 – Simas 2014-09-03 08:06:53

0

你在錯誤的方式做。您正在Activity和Fragment中創建Position類的實例。

嘗試創建內部片段的方法,將收到你已經設置的活動裏面像下面的位置目標:

您的活動的onclick

@Override 
    public void onClick(View v) { 

     Positions pos = new Positions(); 
     pos.setLIpos(LoginB.getY()); 
     pos.setRIpos(RegisterB.getY()); 

     FragmentTransaction transaction = fmanager.beginTransaction(); 
       switch (v.getId()) { 

     case R.id.login_button: 

      transaction.add(R.id.Parent, login, "Loginf"); 
     transaction.addToBackStack("Login"); 
     login.setImagePosition(pos); 

      break; 
     case R.id.Reg_button: 
       transaction.add(R.id.Parent, register, "registerf"); 
      transaction.addToBackStack("registerf"); 
      register.setImagePosition(pos); 
      break; 
     default: 
      break; 
     } 
     transaction.commit(); 

     // TODO Auto-generated method stub 

    } 

你的片段

class Login extends Fragment implements OnGlobalLayoutListener { 

    EditText UN, Pass; 
    View loginimage, loginusing, loginlayout; 

// Login_Register Lg=new Login_Register(); 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View login = inflater.inflate(R.layout.login, container, false); 
    // TODO Auto-generated method stub 
    UN = (EditText) login.findViewById(R.id.UsernameL); 
    Pass = (EditText) login.findViewById(R.id.PassswordL); 
    loginimage = login.findViewById(R.id.LoginImage); 

    loginusing = login.findViewById(R.id.loginusing); 
    loginlayout = login.findViewById(R.id.LoginLayout); 
    loginimage.getViewTreeObserver().addOnGlobalLayoutListener(this); 
    UN.getBackground().setAlpha(50); 
    Pass.getBackground().setAlpha(50); 

    ObjectAnimator.ofFloat(loginusing, View.ALPHA, 0,1).setDuration(1000).start(); 

    return login; 
} 

public void setImagePosition(Positions pos){ 
    Positions poss=pos; 
    float f=poss.getLIpos(); 
} 

} 
+0

感謝您的回覆,上面的答案告訴我一種避免不必要的創建類的實例的更多方法.. – Harsha 2014-09-03 08:38:30

1

我認爲類和概念之間存在混淆。一個類是一個簡單的契約或定義,如果你願意的話,在屬性和功能方面設計對象。一個實例是實際的活動對象,即在運行時應用操作的實例。現在,當你寫:

Position pos = new Position(); 

在它被分配給您由pos引用指向特定實例的內存堆內存。如果在另一個地方,你鍵入:

Position poss = new Position(); 

它包裝箱這是由poss引用的類Position的一個多實例。 posspos與彼此沒有任何關係,它們的內部屬性可能有完全不相關的值。我相信這解釋了爲什麼你不能看到不同實例的相同屬性值。

至於如何處理這個,@ user3249477給出了一些選項,我從中推薦第二個選項。

+0

我不知道創建類的更多實例可能會導致更多的堆內存分配......上面的答案是有幫助的。 – Harsha 2014-09-03 08:31:17