为了防止无意义的争论,请耐心阅读以下部分,大约需要 10 分钟,理念不和请及时关闭页面
适合的阅读人群
不适合阅读人群
阅读方式
为什么是 Android
其实也有 iOS 版和服务器版,但是有一定工作经验的人应该都有体会,同一个项目组,一年经验的 iOS 程序员往往比三年经验的 Android 做出的产品更稳定更好看,因为要写好 Android 太难了,Android 更需要这样一份指南。 Android 从最初发展到现在,单单官方最佳实践指导,就经历了
这个混乱程度,也就是比前端届强一点吧
可以看看这个官方项目,现在开发一个 Android, 复杂到什么程度 https://github.com/googlesamples/android-architecture-components (然而最终成品恐怕还是不如 iOS 随便做一下来的好)
然后你掌握了以上这些所有技术栈,都跟上了最新版
你能轻松工作了么?不能,你还需要花大量时间和产品经理沟通
你的工资涨了么?大多数人也涨不了多少,而且未来还要跟着继续折腾。
我们是目的为了给用户提供更好的产品,不要把有限的生命耗费在无意义的事物上
社会有分工,厨师为了做一盘肉,并不需要自己去养猪,何况大多数厨师也养不好猪
Genos 框架和其他框架有什么不同点
主要有两点
其他
完整代码见 https://github.com/nyssance/genos-samples 的 V2EXSample
Start a new project. [官方指南][https://developer.android.com/studio/projects/create-project.html]
Screen | Configure ------ | --------- Target Android Devices | Phone and Tablet : API 17 Add an Activity to Mobile | Empty Activity
配置_Gradle Scripts: build.gradle (Module: app)_.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 替换为 Genos
// implementation 'com.android.support:appcompat-v7:26.1.0'
// implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.nyssance.genos:genos:1.0.0-rc2'
...
以下代码示例均不含 import, 如果你是 Mac 电脑,把光标移动到每个标红的地方,然后Alt + 回车
,会自动完成需要的操作
AppService.java (实际工作中这个类也应该手写,而应该由服务器端根据格式生成,因为 API 都是服务器端提供的)
public interface APIService {
@GET("topics/{pk}.json")
Call<List<Topic>> topicList(@Path("pk") String pk);
@GET("nodes/show.json")
Call<Node> nodeList(@Query("name") String name);
@GET("members/show.json")
Call<Member> memberList(@Query("id") int id);
}
_AppManager.java
public class AppManager extends BaseAppManager {
private static final AppManager INSTANCE = new AppManager();
public static APIService API;
private AppManager() {
super();
}
public static AppManager getInstance() {
return INSTANCE;
}
@Override
public void settings() {
BASE_URL = "https://www.v2ex.com/api/";
// Create retrofit
API = onCreateRetrofit().create(APIService.class);
}
@Override
public void route(Fragment fragment, String uri) {
}
}
TopicList.java public class TopicList extends TableList<Topic, SubtitleHolder> {
@Override
protected void onPrepare() {
mCall = API.topicList("hot"); // 最热
mTileId = R.layout.list_item_subtitle; // 可以定义你自己的 layout, 定义每一行的样式,对应的 Holder 也需要换成你自己的
}
@Override
protected void onDisplayItem(Topic item, SubtitleHolder holder, int viewType) {
holder.title.setText(item.title);
holder.subtitle.setText("id: " + item.id);
holder.setImage(holder.icon, "https:" + item.node.avatarNormal);
}
@Override
protected void onOpenItem(Topic item) {
Snackbar.make(mListView, "Replace with your own action", Snackbar.LENGTH_SHORT).show();
// 在这里进行点击后的 startActivity 等操作
}
@Override
protected void loadMore(int size, int position) {
// 我没发现 V2EX API 怎么翻页,所以暂时覆写该方法,屏蔽了该功能,能?page=1 这种格式的可以自动翻页, 形式如 mCall = API.topicList("hot", mPage)
}
}
genos.ui.fragment.ListFragment
写一个自己的 TableList, 然后写一个自己的 ListModel, 覆写 TransformListFromData 方法即可MainActivity.java
public class MainActivity extends TabBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragments.append(R.id.navigation_hot, new TopicList());
mFragments.append(R.id.navigation_latest, PlaceholderFragment.newInstance(2));
mFragments.append(R.id.navigation_me, PlaceholderFragment.newInstance(3));
onNavigationItemSelected(R.id.navigation_hot);
}
}
genos.ui.activity.DrawerActivity
即可onCreateOptionsMenu
中 inflate你现在是 Android 专家了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.