【问题标题】:Passing extras between activities that are in tab layout?在选项卡布局中的活动之间传递额外内容?
【发布时间】:2013-08-04 14:00:22
【问题描述】:

我正在制作一个应用程序,它可以录制声音并将其存储在您手机的某个位置。我在此选项卡布局中有一个选项卡布局和两个活动。第一个活动是录制活动,第二个活动是库活动,所有录制的声音都将存储在其中。这就是我想要做的。

应用程序目前的工作方式:录制完成后会弹出一个对话框,其中包含编辑文本,要求用户重命名录制的文件。用户键入某个名称后,将其添加到 ArrayList 中,我立即调用 putExtra()。

fileNames = new ArrayList();
fileNames.add(newFileName);
intent.putExtra("fileNames", fileNames);

现在它停止了。我从来没有遇到过在活动之间传递额外内容的问题。但我以前从未使用过标签布局。所以我的问题是:如何在同一选项卡布局下的两个活动之间传递额外信息?我想这样做是因为我想读取库活动中的数组列表,以便我可以创建所有记录文件的列表视图。

编辑:这是现在的代码:

第一个活动:

fileNames = new ArrayList();
fileNames.add(newFileName);
getParent().getIntent().putExtra("libraryFileNames", fileNames);

第二个活动:

ArrayList fileNames; //creating a global variable for arraylist (outisde of the oncreate
fileNames = getParent().getIntent().getStringArrayListExtra("libraryFileNames");

这是处理它的正确方法吗?我注意到的一个缺陷是,我将额外的作为“字符串数组”,而我有一个普通的 ArrayList,而不是字符串数组列表。另外,我该如何测试这是否有效?

【问题讨论】:

  • normal ArrayList?你能告诉我们normal ArrayList是什么吗?
  • 我就是这么表达的:p

标签: java android eclipse android-intent android-activity


【解决方案1】:

您可以使用选项卡活动作为代理在活动之间发送数据。最好实现一个类似

的接口
public interface FileNameProvider {
    public onNewFileName(String filename);
}

然后从您的孩子活动中:

if (getParent() instanceof FileNameProvider)
    ((FileNameProvider) getParent()).onNewFileName(filename);

选项卡活动应该实现这个接口,并且在它的新方法中它可以切换选项卡(如果需要)并调用它的子活动方法来处理文件名。

已编辑

ActivityOne.java

公共类 ActivityOne 扩展 Activity {

public interface FileNameProvider {
    public void onNewFileName(String filename);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout1);
    findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (getParent() instanceof FileNameProvider) {
                ((FileNameProvider) getParent()).onNewFileName("some file name");
            }
        }
    });
}

}

ActivityTwo.java

公共类 ActivityTwo 扩展 Activity {

public void setFileName(String filename) {
    Log.d("2", "Set filename from first activity " + filename);
}

}

MainActivity.java

public class MainActivity extends TabActivity
    implements ActivityOne.FileNameProvider {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getTabHost().addTab(getTabHost().newTabSpec("tab1")
                .setContent(new Intent(this, ActivityOne.class)));
        getTabHost().addTab(getTabHost().newTabSpec("tab2")
                .setContent(new Intent(this, ActivityTwo.class)));
    }


    @Override
    public void onNewFileName(String filename) {
        LocalActivityManager activityManager = getLocalActivityManager();
        getTabHost().setCurrentTabByTag("tab2");
        ActivityTwo two = (ActivityTwo) activityManager.getActivity("tab2");
        two.setFileName(filename);
    }
}

【讨论】:

  • 对不起,我还是个初学者,我接触 android/java 编程才 3 个月左右。您能否详细说明如何实现这一目标?
  • 我用小例子编辑了我的回复,展示了如何通过父 TabActivity 调用其他子活动。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多