【问题标题】:read from file in android using assets使用资产从android中的文件读取
【发布时间】:2015-05-04 13:20:13
【问题描述】:

我正在尝试从 android 中的资产中读取文件。我希望每个按钮都打印一个段落,例如第一个按钮打印第一段,第二个按钮打印第二段。 我尝试使用下面的代码,但它不起作用。

我收到此错误消息:

03-03 18:40:17.800: E/AndroidRuntime(977): FATAL EXCEPTION: main 
03-03 18:40:17.800: E/AndroidRuntime(977): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.example.hajjapp.AfterHajj } 
03-03 18:40:17.800: E/AndroidRuntime(977): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622) 
03-03 18:40:17.800: E/AndroidRuntime(977): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417) 
03-03 18:40:17.800: E/AndroidRuntime(977): at android.app.Activity.startActivityForResult(Activity.java:3370) – 

谁能告诉我问题出在哪里?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

  import android.support.v7.app.ActionBarActivity;
 import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Dialog;
import android.content.res.AssetManager;

 public class BeforeHajj extends ActionBarActivity {
  Button whatHajj;
  TextView text;
  Button hajjTime;
  String before;
  String [] s;
  String timeHajj="";
  @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_before_hajj);

    whatHajj = (Button)findViewById(R.id.whatisHajj);
    hajjTime = (Button)findViewById(R.id.hajjTime);
    text =  (TextView)findViewById(R.id.text);


    whatHajj.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            try
        {


            AssetManager assetmanager=getAssets();
            InputStream input=assetmanager.open("beforehaj.txt");
            BufferedReader br=new BufferedReader(new InputStreamReader(input));

            String st="";
            StringBuilder sb=new StringBuilder();
            while((st=br.readLine())!=null)
            {

                sb.append(st);


                before+=sb.toString();
                s=before.split("*");
            }
            text.setText(before);
        }
        catch(IOException ep) {
            text.append(ep.toString());
            }

        }
    });




    hajjTime.setOnClickListener(new View.OnClickListener() {

    public void onClick(View view) {
    // custom dialog

   try
        {


            AssetManager assetmanager=getAssets();
            InputStream input=assetmanager.open("beforehaj.txt");
            BufferedReader br=new BufferedReader(new InputStreamReader(input));

            String st="";
            StringBuilder sb=new StringBuilder();
            while((st=br.readLine())!=null){
                sb.append(st);
                before+=sb.toString();
                s=before.split("*");
            }
        }
            catch(IOException ep) {
                text.append(ep.toString());
            }
        final Dialog dialog = new Dialog(BeforeHajj.this);
        dialog.setContentView(R.layout.guide_dialog);
        dialog.setTitle("Hajj Time");

        // set the custom dialog components - text, image and button
        TextView text = (TextView) dialog.findViewById(R.id.dialog_text);
        text.append(s[0]);
        ImageView image = (ImageView) dialog.findViewById(R.id.dialog_image);
        image.setImageResource(R.drawable.dolheja);
        Button dialogButton = (Button)  dialog.findViewById(R.id.dialog_button);
        // if button is clicked, close the custom dialog

        dialogButton.setOnClickListener(new View.OnClickListener() {


                @Override
                public void onClick(View view) {
                    dialog.dismiss();

                }
            });

            dialog.show();
          }
        });
  }







 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.before_hajj, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

【问题讨论】:

  • 请解释“但它不工作”是什么意思。例如,您的程序是否崩溃?如果是,与崩溃相关的 Java 堆栈跟踪是什么?
  • 是的,它会停止应用程序
  • 03-03 18:40:17.800: E/AndroidRuntime(977): 致命异常: main 03-03 18:40:17.800: E/AndroidRuntime(977): android.content.ActivityNotFoundException:没有发现活动来处理 Intent { act=com.example.hajjapp.AfterHajj } 03-03 18:40:17.800: E/AndroidRuntime(977): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622) 03- 03 18:40:17.800: E/AndroidRuntime(977): 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1417) 03-03 18:40:17.800: E/AndroidRuntime(977): 在 android.app。 Activity.startActivityForResult(Activity.java:3370)

标签: java android file android-activity android-assets


【解决方案1】:

使用换行符分割段落。所有段落都以新行开头,所以使用

before.split("\\\n");

这将为您完成这项工作。

【讨论】:

  • 好的,谢谢你的工作,但我仍然有这个错误,第二个按钮有对话框 03-03 19:55:09.601: E/AndroidRuntime(1002): FATAL EXCEPTION: main 03-03 19 :55:09.601: E/AndroidRuntime(1002): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 03-03 19:55:09.601: E/AndroidRuntime(1002): at com.example.hajjapp.BeforeHajj$2.onClick(BeforeHajj.java:103) 03-03 19:55:09.601: E/AndroidRuntime( 1002): 在 android.view.View.performClick(View.java:4204) 03-03 19:55:09.601: E/AndroidRuntime(1002): 在 android.view.View$PerformClick.run(View.java:17355 )
  • 首先让我明白,你想在UI中根据你正在阅读的文件中的段落数动态创建按钮吗?还是固定两个按钮?
  • 我已经创建了它们,它们是 6 个按钮,每个按钮都会读取一个段落
  • 根据您的代码,您正在使用全局字符串“之前”来存储第一次按钮单击时的字符串。哪个具有修改后的字符串,就像您之前使用过的那样+=sb.toString();然后稍后在第二个按钮单击您正在拆分之前的字符串。我相信您应该在第二个按钮上清除之前的字符串,并在将原始值拆分为 setText 后分配下一个索引。
【解决方案2】:

使用转义符号使“*”被split 识别,例如s.split("\\*");

【讨论】:

  • 是的,我解决了这个问题,谢谢。但我的大问题是拆分,因为我有一个包含很多段落的文件,我希望不同的按钮只能查看同一文件的一个段落
  • 我应该在段落之间加上相同的符号吗?
【解决方案3】:

在某个地方,您正在尝试启动一个应该在 Java 类com.example.hajjapp.AfterHajj 中实现的活动。错误消息告诉您该类的清单中没有 <activity> 元素。另请注意,您粘贴到问题中的代码来自名为 BeforeHajj 的 Java 类。

【讨论】:

  • 03-03 18:48:06.150:E/AndroidRuntime(1144):致命异常:主要 03-03 18:48:06.150:E/AndroidRuntime(1144):java.util.regex。 PatternSyntaxException:索引 1 附近的正则表达式模式中的语法错误:03-03 18:48:06.150: E/AndroidRuntime(1144): * 03-03 18:48:06.150: E/AndroidRuntime(1144): ^ 03-03 18: 48:06.150: E/AndroidRuntime(1144): 在 java.util.regex.Pattern.compileImpl(Native Method) 03-03 18:48:06.150: E/AndroidRuntime(1144): 在 java.util.regex.Pattern。编译(Pattern.java:407) 03-03 18:48:06.150: E/AndroidRuntime(1144): at java.util.regex.Pattern.(Pattern.java:390)
  • @balloontofly:这可能来自s=before.split("*");,因为* 在Java 中不是有效的正则表达式。
  • 那我可以用什么来代替 * ?
  • @balloontofly:很抱歉,我无法理解这个问题。在主要搜索引擎上搜索java regular expressions 会出现许多信息页面,这些信息可以帮助您创建有效的正则表达式,以配合the existing documentation。如果你真的想在星号字符 (*) 上进行拆分,我认为 \\* 将是正确的常规语法。
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2016-04-25
  • 2012-05-11
  • 2012-03-21
  • 2013-10-06
相关资源
最近更新 更多