android中fragments api能够满足多种屏幕尺寸、屏幕旋转的需求。为此,视图模块化是很有必要的,这样能够很方便得把activity容器从UI中分离出来,使开发者能够创建需更敏捷、更加易于创建的接口。
package com.marakana.android.yamba;
import android.app.Fragment;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.marakana.android.yamba.clientlib.YambaClient;
import com.marakana.android.yamba.clientlib.YambaClientException;
public class StatusFragment extends Fragment implements OnClickListener {
private static final String TAG = "StatusFragment";
private EditText editStatus;
private Button buttonTweet;
private TextView textCount;
private int defaultTextColor;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater
.inflate(R.layout.fragment_status, container, false);
editStatus = (EditText) view.findViewById(R.id.editStatus);
buttonTweet = (Button) view.findViewById(R.id.buttonTweet);
textCount = (TextView) view.findViewById(R.id.textCount);
buttonTweet.setOnClickListener(this);
defaultTextColor = textCount.getTextColors().getDefaultColor();
editStatus.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
int count = 140 - editStatus.length();
textCount.setText(Integer.toString(count));
textCount.setTextColor(Color.GREEN);
if (count < 10)
textCount.setTextColor(Color.RED);
else
textCount.setTextColor(defaultTextColor);
}
@Override
public void beforeTextChanged(CharSequence s,
int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s,
int start, int before,
int count) {
}
});
return view;
}
@Override
public void onClick(View view) {
String status = editStatus.getText().toString();
Log.d(TAG, "onClicked with status: " + status);
new PostTask().execute(status);
}
private final class PostTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
YambaClient yambaCloud =
new YambaClient("student", "password");
try {
yambaCloud.postStatus(params[0]);
return "Successfully posted";
} catch (YambaClientException e) {
e.printStackTrace();
return "Failed to post to yamba service";
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Toast.makeText(StatusFragment.this.getActivity(),
result, Toast.LENGTH_LONG).show();
}
}
}
如果要添加Fragment,需要引进三个附加类:android.app.Fragment、android.view.LayoutInflater和android.view.ViewGroup。重写onCreateView方法,并在其中创建一个视图(以前由onCreate创建的视图)。
View view=inflater.inflate(R.layout.fragment_status, container,false)为fragment创建一个视图。
这个fragment的layout XML也很简单。重命名原来的xml文件,改为fragment_status.xml。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/fragment_status"
android:name="com.marakana.android.yamba.StatusFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
XML最终会变成java代码,因此,在XML中的所有东西都可以在java代码中动态生成。下面的代码显示怎样动态地加载fragment
package com.marakana.android.yamba;
import android.os.Bundle;
public class StatusActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Check if this activity was created before
if (savedInstanceState == null) { //
// Create a fragment
StatusFragment fragment = new StatusFragment(); //
getFragmentManager()
.beginTransaction()
.add(android.R.id.content, fragment,
fragment.getClass().getSimpleName())
.commit(); //
}
}
}
在这里,不再使用setContentView()方法,而是检查这个activity是不是第一次被创建。因为如果这个activity已经存在并且用户已经使用了这个界面,那么我们可以在代码中实现这里的功能。
StatusFragment fragment = new StatusFragment(); //第一次使用的话,需要初始化fragment
然后,从当前上下文中获取fragemtn管理器,启动一个事务,把新的fragemtn附加到这个activity上,然后提交事务。