学习android - 创建一个稍微修改的类来重用代码 - sdk

时间:2011-10-29 14:32:30

标签: java android sdk

过去一周我一直在学习android开发(在Eclipse中)。我正在尽可能地跟踪在线课程和阅读书籍,同时也在挖掘并尝试编写应用程序。我在一个应用程序中玩GreenDroid,我有一个真实的例子来运行你。

我的主应用程序类如下:

public class InfoActivity extends GDListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(R.string.info_activity_title);

    ItemAdapter adapter = new ItemAdapter(this);
    adapter.add(createTextItem(R.string.info_about, AboutActivity.class));
    adapter.add(createTextItem(R.string.info_terms, TermsActivity.class));
    adapter.add(createTextItem(R.string.info_privacy, PrivacyActivity.class));

    setListAdapter(adapter);
}

private TextItem createTextItem(int stringId, Class<?> klass) {
    final TextItem textItem = new TextItem(getString(stringId));
    textItem.setTag(klass);
    return textItem;
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    final TextItem textItem = (TextItem) l.getAdapter().getItem(position);
    Intent intent = new Intent(InfoActivity.this, (Class<?>) textItem.getTag());
    startActivity(intent);
}
}

一切都运作良好。这是我的问题 - 我如何重新使用其他类中的代码,但是接受一个变量并根据它进行更改? - 行

adapter.add(createTextItem(R.string.info_about, AboutActivity.class));

需要创建另一个活动类。代码如下:

public class AboutActivity extends GDActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(R.string.info_about);
    setActionBarContentView(R.layout.info_template);

    WebView engine = (WebView) findViewById(R.id.web_view);  
    engine.setBackgroundColor(0);
    engine.setBackgroundResource(R.drawable.bg);
    engine.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.loadUrl("http://m.example.com/about.html");
    engine.setWebViewClient(new WebViewWithin());
}
}

另外两个类别TermsActivity和PrivacyActivity是相同的,除了两部分:

setTitle(R.string.info_about);

engine.loadUrl("http://m.example.com/about.html");

后一个活动示例中的内容是:

setTitle(R.string.info_privacy);

engine.loadUrl("http://m.example.com/privacy.html");

由于这是我第一次学习Java,我仍然围绕着很多概念。我非常精通PHP,并且会编写一个函数,可以将字符串变量放入函数中(有效地重复使用相同的代码),例如:

这是PHP和Java伪代码,可以解释我的观点。

<?php 
function aboutSecondaryPage( $page ) {
  setTitle( this.getString( R.string.info_ . $page ) );
  engine.loadUrl("http://m.example.com/" . $page . ".html" );
}
 ?>

因此,给出这些示例,是否有更好的方法让这三个类中的每一个重用相同的代码并从另一个类调用它。任何指导都会有用。一如既往,一切正常,我只是想从那些有更多经验的人那里学习。

谢谢!

当前的解决方案(在KURTIS优秀助理之后)

我的父活动方法,其他三个活动继承自:

public class InfoSecActivity extends GDListActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(getTitleResourceId());
    setActionBarContentView(R.layout.info_template);

    WebView engine = (WebView) findViewById(R.id.web_view);  
    engine.setBackgroundColor(0);
    engine.setBackgroundResource(R.drawable.bg);
    engine.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.loadUrl(getUrlToLoad());
    engine.setWebViewClient(new WebViewWithin());
}

public int getTitleResourceId() {
    return 0;
}

public String getUrlToLoad() {
    return null;
}

}

从InfoActivity类调用的子类示例。

public class AboutActivity extends InfoSecActivity {

public int getTitleResourceId() {
    return R.string.info_about;
}

public String getUrlToLoad() {
    return "http://m.example.com/about.html";
}

}

它运作得很漂亮,但为了学习最佳实践 - 我是否已经做到了最好的方法和任何需要注意的事项(这种方法的潜在问题)?这主要是为了Kurtis - 希望你再读一遍:-)

1 个答案:

答案 0 :(得分:1)

您可以随时获取重用的代码并将其提取到抽象父类中。因此,在这个父类中,您将放置所有活动共享的所有代码。但是在代码不同的地方,您可以调用在每个子类中具体实现的抽象方法。这称为Template Design Patter。例如,在您的抽象父类的onCreate方法中,您可以这样做:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(getTitleResourceId());
    setActionBarContentView(R.layout.info_template);

    WebView engine = (WebView) findViewById(R.id.web_view);  
    engine.setBackgroundColor(0);
    engine.setBackgroundResource(R.drawable.bg);
    engine.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.loadUrl(getUrlToLoad());
    engine.setWebViewClient(new WebViewWithin());
}

在这种情况下,您可以在父类中将getTitleResourceId()getUrlToLoad()声明为abstract。然后在每个子类中,您必须编写的唯一代码是getTitleResourceId()getUrlToLoad()方法的定义。例如,在您的隐私权活动中,您有这些方法分别返回R.string.info_privacy"http://m.example.com/privacy.html"。但是在你的其他子类中,你会让它们返回不同的值。